BufferedReader br = new BufferedReader(fr);
int cnt = 0;
while (br.readLine() != null)
cnt++;
br.close();
System.out.println(cnt);
} catch (IOException e) {
System.err.println(e);
}
}
}這個(gè)方法更快。例如在一個(gè)有200,000行的 6 MB文本文件上,第二個(gè)程序比第一個(gè)快大約20%。
但是即使第二個(gè)程序不是更快的,第一個(gè)程序依然有一個(gè)重要的問(wèn)題要注意。第一個(gè)程序在JavaTM 2編譯器下引起了不贊成警告,因?yàn)镈ataInputStream.readLine太陳舊了。它不能恰當(dāng)?shù)膶⒆止?jié)轉(zhuǎn)換為字符,因此在操作包含非ASCII字符的文本文件時(shí)可能是不合適的選擇。(Java語(yǔ)言使用Unicode字符集而不是ASCII)
這就是早些時(shí)候提到的字節(jié)流和字符流之間的區(qū)別。像這樣的一個(gè)程序:
import java.io.*;
public class conv1 {
public static void main(String args[]) {
try {
FileOutputStream fos = new FileOutputStream("out1");
PrintStream ps = new PrintStream(fos);
ps.println("\uffff\u4321\u1234");
ps.close();
} catch (IOException e) {
System.err.println(e);
}
}
}向一個(gè)文件里面寫(xiě),但是沒(méi)有保存實(shí)際的Unicode字符輸出。Reader/Writer I/O 類(lèi)是基于字符的,被設(shè)計(jì)用來(lái)解決這個(gè)問(wèn)題。OutputStreamWriter 應(yīng)用于字節(jié)編碼的字符。
一個(gè)使用PrintWriter寫(xiě)入U(xiǎn)nicode字符的程序是這樣的:
import java.io.*;
public class conv2 {
public static void main(String args[]) {
try {
FileOutputStream fos = new FileOutputStream("out2");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF8");
PrintWriter pw = new PrintWriter(osw);
pw.println("\uffff\u4321\u1234");
pw.close();
} catch (IOException e) {
System.err.println(e);
}
}
}
這個(gè)程序使用UTF8編碼,具有ASCII文本是本身而其他字符是兩個(gè)或三個(gè)字節(jié)的特性。
相關(guān)推薦:計(jì)算機(jī)等級(jí)考試二級(jí)Java經(jīng)典算法大全匯總北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |