java高效文件流讀寫操作詳解
導(dǎo)語
防止自己以后忘記,記錄一些文件流的性能對比。
平常經(jīng)常會操作到文件讀寫,java當(dāng)中提供了許多操作文件的類,一般來說,文件操作也叫流操作,可以按照以下方式分類:
- 按照功能分類,字節(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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
本文給大家分享的是一則使用java編寫的文件管理器的代碼,新人練手的作品,邏輯上還是有點小問題,大家?guī)兔纯窗伞?/div> 2015-04-04
小議Java的源文件的聲明規(guī)則以及編程風(fēng)格
這篇文章主要介紹了小議Java的源文件的聲明規(guī)則以及編程風(fēng)格,僅給Java初學(xué)者作一個簡單的示范,需要的朋友可以參考下2015-09-09
idea啟動報錯:Command line is too long問題
在使用IDEA時,若遇到"Commandlineistoolong"錯誤,通常是因為命令行長度超限,這是因為IDEA通過命令行或文件將classpath傳遞至JVM,操作系統(tǒng)對命令行長度有限制,解決方法是切換至動態(tài)類路徑,通過修改項目的workspace.xml文件2024-09-09
java 鍵盤輸入一個數(shù),輸出數(shù)組中指定元素的示例
今天小編就為大家分享一篇java 鍵盤輸入一個數(shù),輸出數(shù)組中指定元素的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07最新評論

