方法 2: 使用大緩沖區(qū)
第二種方法使用大緩沖區(qū)避免了上面的問題:
import java.io.*;
public class intro2 {
public static void main(String args[]) {
if (args.length != 1) {
System.err.println("missing filename");
System.exit(1);
}
try {
FileInputStream fis = new FileInputStream(args[0]);
BufferedInputStream bis = new BufferedInputStream(fis);
int cnt = 0;
int b;
while ((b = bis.read()) != -1) {
if (b == '\n')
cnt++;
}
bis.close();
System.out.println(cnt);
} catch (IOException e) {
System.err.println(e);
}
}
}
BufferedInputStream.read 從輸入緩沖區(qū)獲取下一個字節(jié),僅僅只訪問了一次底層系統(tǒng)。
方法 3: 直接緩沖
第三種方法避免使用 BufferedInputStream 而直接緩沖,因此排除了 read 方法的調(diào)用:
import java.io.*;
public class intro3 {
public static void main(String args[]) {
if (args.length != 1) {
System.err.println("missing filename");
System.exit(1);
}
try {
FileInputStream fis = new FileInputStream(args[0]);
byte buf[] = new byte[2048];
int cnt = 0;
int n;
while ((n = fis.read(buf)) != -1) {
for (int i = 0; i < n; i++) {
if (buf[i] == '\n')
cnt++;
}
}
fis.close();
System.out.println(cnt);
} catch (IOException e) {
System.err.println(e);
}
}
}
對于一個1 MB 的輸入文件,以秒為單位的執(zhí)行時(shí)間是:
intro1 6.9 intro2 0.9 intro3 0.4
或者說在最慢的方法和最快的方法間是17比1的不同。
這個巨大的加速并不能證明你應(yīng)該總是使用第三種方法,即自己做緩沖。這可能是一個錯誤的傾向特別是在處理文件結(jié)束事件時(shí)沒有仔細(xì)的實(shí)現(xiàn)。在可讀性上它也沒有其它方法好。但是記住時(shí)間花費(fèi)在哪兒了以及在必要的時(shí)候如何矯正是很有用。
方法2 或許是對于大多應(yīng)用的 "正確" 方法.
相關(guān)推薦:計(jì)算機(jī)等級考試二級Java經(jīng)典算法大全匯總北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |