java高效文件流讀寫操作詳解
導語
防止自己以后忘記,記錄一些文件流的性能對比。
平常經(jīng)常會操作到文件讀寫,java當中提供了許多操作文件的類,一般來說,文件操作也叫流操作,可以按照以下方式分類:
- 按照功能分類,字節(jié)流和字符流。
- 按照節(jié)點流和過濾流,節(jié)點流直接操作文件,過濾流包裝了節(jié)點流和過濾流。如FileInputStream和BufferedFileInputStream就是分別是節(jié)點流和過濾流。
文件流比較
下面重點比較我們經(jīng)常用的幾個流
(1) DataInputStream+FileInputStream
(2) DataInputStream+BufferedInputStream
(3) BufferedReader+FileReader(緩沖流大小不同性能也不同,如1K和8K)
(4) BufferedFileReader
先貼結(jié)論:
耗時對比為:
(4)優(yōu)于(3)—8096優(yōu)于(3)-1024優(yōu)于(2)<(1)



另外,BufferedFileReader如果涉及到讀取文件的每一行內(nèi)容還可以在優(yōu)化,傳統(tǒng)的代碼如下所示:
BufferedFileReader in = new BufferedFileReader();
for (int i=0; i < nargs; i++) {
try {
in.open(args[i]);
while ((line = in.readLine()) != null) {
nlines++;
} in.close();
} catch (Exception e) {
System.out.println(" BFRTest: exception:" + e );
}
代碼中第5行,BufferedReader首先生成一個StringBuffer,然后轉(zhuǎn)成一個String返回,這里涉及到兩次字符拷貝。假設(shè)讀取10000行,會有10000個臨時的String對象生成,內(nèi)存比較耗費,由于BufferedReader的緩沖流是私有的,因此這里的優(yōu)化點是可以自己管理緩沖流。最佳的讀文件的方法代碼如下:
FileReader fr;
int nlines = 0;
char buffer[] = new char[8192 + 1];
int maxLineLength = 128;
//assumes no line is longer than this
char lineBuf[] = new char[maxLineLength];
for (int i = 0; i < nargs; i++) {
try {
fr = new FileReader(args[i]);
int nChars = 0;
int nextChar = 0;
int startChar = 0;
boolean eol = false;
int lineLength = 0;
char c = 0;
int n;
int j;
while (true) {
if (nextChar >= nChars) {
n = fr.read(buffer, 0, 8192);
if (n == -1) { // EOF
break;
}
nChars = n;
startChar = 0;
nextChar = 0;
}
for (j = nextChar; j < nChars; j++) {
c = buffer[j];
if ((c == '\n') || (c == '\r')) {
eol = true;
break;
}
}
nextChar = j;
int len = nextChar - startChar;
if (eol) {
nextChar++;
if ((lineLength + len) > maxLineLength) {
// error
} else {
System.arraycopy(buffer, startChar, lineBuf, lineLength, len);
}
lineLength += len;
//
// Process line here
//
nlines++;
if (c == '\r') {
if (nextChar >= nChars) {
n = fr.read(buffer, 0, 8192);
if (n != -1) {
nextChar = 0;
nChars = n;
}
}
if ((nextChar < nChars) && (buffer[nextChar] == '\n'))
nextChar++;
}
startChar = nextChar;
lineLength = 0;
continue;
}
if ((lineLength + len) > maxLineLength) {
// error
} else {
System.arraycopy(buffer, startChar, lineBuf, lineLength, len);
}
lineLength += len;
}
fr.close();
} catch (Exception e) {
System.out.println("exception: " + e);
}
NIO文件流
FileChanel介紹
通道,之前流是單向的,而通道是雙向的,既可以讀,也可以寫。讀取文件效率參考這里。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
logback?OutputStreamAppender高效日志輸出源碼解析
這篇文章主要介紹了為大家logback?OutputStreamAppender日志輸出效率提升示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10
springboot+mybatis-plus基于攔截器實現(xiàn)分表的示例代碼
本文主要介紹了springboot+mybatis-plus基于攔截器實現(xiàn)分表,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11
Java中的synchronized和ReentrantLock的區(qū)別詳細解讀
這篇文章主要介紹了Java中的synchronized和ReentrantLock的區(qū)別詳細解讀,synchronized是Java內(nèi)建的同步機制,所以也有人稱其為 IntrinsicLocking,它提供了互斥的語義和可見性,當一個線程已經(jīng)獲取當前鎖時,其他試圖獲取的線程只能等待或者阻塞在那里,需要的朋友可以參考下2024-01-01
java如何判斷一個數(shù)是否是素數(shù)(質(zhì)數(shù))
這篇文章主要介紹了java如何判斷一個數(shù)是否是素數(shù)(質(zhì)數(shù)),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
Java實現(xiàn)學生信息管理系統(tǒng)(借助Array?List)
這篇文章主要為大家詳細介紹了Java實現(xiàn)學生信息管理系統(tǒng),借助Array?List,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01
SpringBoot項目的logback日志配置(包括打印mybatis的sql語句)
這篇文章主要介紹了SpringBoot項目的logback日志配置(包括打印mybatis的sql語句),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09
Java使用Collections.sort()排序的示例詳解
這篇文章主要介紹了Java使用Collections.sort()排序的示例詳解,Collections.sort(list, new PriceComparator());的第二個參數(shù)返回一個int型的值,就相當于一個標志,告訴sort方法按什么順序來對list進行排序。對此感興趣的可以了解一下2020-07-07

