1.1.3.2.2 緩沖
方法 2 和 3 使用了緩沖技術(shù), 大塊文件被從磁盤讀取,然后每次訪問一個字節(jié)或字符。緩沖是一個基本而重要的加速I/O 的技術(shù),而且有幾個類支持緩沖(BufferedInputStream 用于字節(jié), BufferedReader 用于字符)。
一個明顯得問題是: 緩沖區(qū)越大I/O越快嗎?典型的Java緩沖區(qū)長1024 或者 2048 字節(jié),一個更大的緩沖區(qū)有可能加速 I/O但是只能占很小的比重,大約5 到10%。
方法4: 整個文件
緩沖的極端情況是事先決定整個文件的長度,然后讀取整個文件:
import java.io.*;
public class readfile {
public static void main(String args[]) {
if (args.length != 1) {
System.err.println("missing filename");
System.exit(1);
}
try {
int len = (int) (new File(args[0]).length());
FileInputStream fis = new FileInputStream(args[0]);
byte buf[] = new byte[len];
fis.read(buf);
fis.close();
int cnt = 0;
for (int i = 0; i < len; i++) {
if (buf[i] == '\n')
cnt++;
}
System.out.println(cnt);
} catch (IOException e) {
System.err.println(e);
}
}
}這個方法很方便,在這里文件被當(dāng)作一個字節(jié)數(shù)組。但是有一個明顯得問題是有可能沒有讀取一個巨大的文件的足夠的內(nèi)存。
緩沖的另一個方面是向窗口終端的文本輸出。缺省情況下, System.out ( 一個PrintStream) 是行緩沖的,這意味著在遇到一個新行符后輸出緩沖區(qū)被提交。對于交互來說這是很重要的,在那種情況下你可能喜歡在實際的輸出前顯示一個輸入提示。
方法 5: 關(guān)閉行緩沖
行緩沖可以被禁止,像下面的例子那樣:
import java.io.*;
public class bufout {
public static void main(String args[]) {
FileOutputStream fdout = new FileOutputStream(FileDescriptor.out);
BufferedOutputStream bos = new BufferedOutputStream(fdout, 1024);
PrintStream ps = new PrintStream(bos, false);
System.setOut(ps);
final int N = 100000;
for (int i = 1; i <= N; i++)
System.out.println(i);
ps.close();
}
}
這個程序輸出整數(shù)1到100000缺省輸出,比在缺省的行緩沖情況下快了三倍。
緩沖也是下面將要展示的例子的重要部分,在那里,緩沖區(qū)被用于加速文件隨機(jī)訪問。
相關(guān)推薦:計算機(jī)等級考試二級Java經(jīng)典算法大全匯總北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |