1. 字節流和字符流的概念
1.1 字節流繼承於InputStream OutputStream,
1.2 字符流繼承於InputStreamReader OutputStreamWriter。
在java.io包中還有許多其他的流,主要是為了提高性能和使用方便。
2. 字節流與字符流的區別
2.1 要把一片二進制數據數據逐一輸出到某個設備中,或者從某個設備中逐一讀取一片二進制數據,不管輸入輸出設備是什么,我們要用統一的方式來完成這些操作,用一種抽象的方式進行描述,這個抽象描述方式起名為IO流,對應的抽象類為OutputStream和InputStream,不同的實現類就代表不同的輸入和輸出設備,它們都是針對字節進行操作的。
2.2 在應用中,經常要完全是字符的一段文本輸出去或讀進來,用字節流可以嗎?計算機中的一切最終都是二進制的字節形式存在。對於“中國”這些字符,首先要得到其對應的字節,然后將字節寫入到輸出流。讀取時,首先讀到的是字節,可是我們要把它顯示為字符,我們需要將字節轉換成字符。由於這樣的需求很廣泛,人家專門提供了字符流的包裝類。
2.3 底層設備永遠只接受字節數據,有時候要寫字符串到底層設備,需要將字符串轉成字節再進行寫入。字符流是字節流的包裝,字符流則是直接接受字符串,它內部將串轉成字節,再寫入底層設備,這為我們向IO設別寫入或讀取字符串提供了一點點方便。
字符向字節轉換時,要注意編碼的問題,因為字符串轉成字節數組,
其實是轉成該字符的某種編碼的字節形式,讀取也是反之的道理。
字節流與字符流關系的案例:
package com.kobicc.cec.testDemo2;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.PrintWriter;
public class IOTest2 {
public static void main(String[] args) throws Exception {
String str = "中國人";
// 方式一【使用字節流輸入,字節流輸出。使用了字節緩沖區】
FileOutputStream fos = new FileOutputStream("D:\\1.txt");
fos.write(str.getBytes("UTF-8"));
fos.close();
FileInputStream fr = new FileInputStream("D:\\1.txt");
byte[] buf = new byte[1024];
int len;
String myStr = "";
while ((len = fr.read(buf)) != -1) {
myStr += new String(buf, 0, len, "UTF-8");
}
//String myStr = new String(buf, 0, len, "UTF-8"); //方式二
System.out.println(myStr);
// 方式二【使用字符流輸入,字符流輸出。使用了字符緩沖區】
FileWriter fw = new FileWriter("D:\\2.txt");
fw.write(str);
fw.close();
FileReader fr2 = new FileReader("D:\\2.txt");
char[] buf2 = new char[1024];
int len2 = fr2.read(buf2);
String myStr2 = new String(buf2, 0, len2);
System.out.println(myStr2);
// 方式三【使用字符流輸入,字符流輸出,沒有使用緩沖區,直接讀行】
PrintWriter pw = new PrintWriter("D:\\3.txt", "utf-8");
pw.write(str);
pw.close();
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream("D:\\3.txt"), "utf-8"));
String myStr3 = br.readLine();
br.close();
System.out.println(myStr3);
}
}
