位元組流、字元流涉及的類比較多,比較容易混淆。因此,有必要針對何時使用位元組流、何時使用字元流、何時使用Buffer類的流做一個歸納。要歸納它們,無需過多的語言,只需抓住它們的重點和特性即可。 在決定何時使用何種類時,以下幾個問題需要考慮清楚。 數據源:表示輸入,或稱為讀。可提供使用的兩個父類為Inpu ...
位元組流、字元流涉及的類比較多,比較容易混淆。因此,有必要針對何時使用位元組流、何時使用字元流、何時使用Buffer類的流做一個歸納。要歸納它們,無需過多的語言,只需抓住它們的重點和特性即可。
在決定何時使用何種類時,以下幾個問題需要考慮清楚。
- 是否有數據源、數據的流向是否有目標。
- 數據源:表示輸入,或稱為讀。可提供使用的兩個父類為InputStream和Reader。
- 有目標:表示輸出,或稱為寫。可提供使用的兩個父類為OutputStream和Writer。
- 應該使用位元組流還是字元流?如果源或目標包含非ascii字元,則採用字元流。
- 源和目標是何種設備類型。
- 源 :磁碟文件File,記憶體(位元組/字元數組),鍵盤System.in,網路socket
- 目標:磁碟文件File,記憶體(位元組/字元數組),屏幕System.out,網路socket
- 是否需要使用BufferedReader/BufferedWriter?這需要考慮是否需要額外的特殊功能,包括操作行,字元集轉換,使用緩衝區提高效率。字元集轉換過程中涉及了位元組流轉換為字元流的過程,可能需要使用InputStreamReader和OutputStreamWriter作為轉換的橋梁。
最後,需要知道的是對於使用BufferedReader的輸入流,有時候可以考慮使用字元數組可能效果和性能更好。
以下是一個應用以上規律的需求示例:讀取包含gbk簡體中文的文件數據,並以utf-8編碼複製到另一個文件中。
//1.有源有目標,且都是文件。 //2.讀取和寫入都包含中文字元,所以採用字元流。 //3.寫入過程中需要轉碼,因此需要使用OutputStreamWriter。 //4.可以使用緩衝區功能提高效率。
import java.io.*;
public class CP {
public static void main(String[] args) throws IOException {
File src = new File("d:/myjava/a.txt");
File dest = new File("d:/myjava/a_bak.txt");
cp(src,dest);
}
public static void cp(File src,File dest) throws IOException {
BufferedReader bufr = new BufferedReader(new FileReader(src));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(dest),"utf-8"));
//按行讀取
String line = null;
while((line=bufr.readLine())!=null) {
bufw.write(line);
bufw.newLine();
bufw.flush();
}
bufw.close();
}
}
上述代碼執行後,目標文件中的末尾將比源文件多一個空行,上述方法對這個問題不是很好解決。但如果使用字元數組來替代BufferedReader,則沒有這樣的問題,如下。
import java.io.*;
public class CP {
public static void main(String[] args) throws IOException {
File src = new File("d:/myjava/a.txt");
File dest = new File("d:/myjava/a_bak.txt");
cp(src,dest);
}
public static void cp(File src,File dest) throws IOException {
FileReader fr = new FileReader(src);
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(dest),"utf-8"));
char[] buf = new char[1024];
int len = 0;
while ((len=fr.read(buf))!=-1) {
bufw.write(buf,0,len);
bufw.flush();
}
bufw.close();
}
}
註:若您覺得這篇文章還不錯請點擊右下角推薦,您的支持能激發作者更大的寫作熱情,非常感謝!