古冶區(qū)城鄉(xiāng)建設(shè)局網(wǎng)站seo技術(shù)培訓(xùn)江門
1、IO流
IO流:數(shù)據(jù)傳輸過程類似于水流,故稱IO流
IO流的的40多個類都是從4個抽象類基類中派生出來的,前者是字節(jié),后者是字符
- InputStream/Reader:所有的輸入流的基類
- OutputStream/Writer:所有輸出流的基類
2、字符流和字節(jié)流的區(qū)別
- 字符流是由Java虛擬機將字節(jié)轉(zhuǎn)換得到的,這個過程比較耗時
- 如果我們不知道編碼類型就很容易出現(xiàn)問題
- 根據(jù)實際應(yīng)用中操作對象的不同選用合適的方法
- Reader 用于讀取文本, InputStream 用于讀取原始字節(jié)
- 字符和字節(jié)的編碼轉(zhuǎn)換:utf8 :英文占 1 字節(jié),中文占 3 字節(jié),unicode:任何字符都占 2 個字節(jié),gbk:英文占 1 字節(jié),中文占 2 字節(jié)
3、字節(jié)流
1、InputStream(字節(jié)輸入流)
1、InputStream: 用于從源頭(通常是文件)讀取數(shù)據(jù)(字節(jié)信息)到內(nèi)存中
2、常用方法
- read():返回輸入流中下一個字節(jié)的數(shù)據(jù)
- skip():忽略輸入流的n個字節(jié)
- available():返回輸入流中可以讀取的字節(jié)數(shù)
- close():關(guān)閉輸入流,釋放相關(guān)的系統(tǒng)資源
- readAllBytes():讀取輸入流中的所有字節(jié),返回字節(jié)數(shù)組
- transferTo(OutputStream out):將所有字節(jié)從一個輸入流傳遞到一個輸出流
3、常用子類
- FileInputStream:和文件相關(guān)的字節(jié)輸入流類
//新建一個字節(jié)文件輸入流對象
InputStream fis = new FileInputStream("input.txt")
- BufferedInputStream:字節(jié)緩存輸入流
// 新建一個 BufferedInputStream 對象
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("input.txt"));
// 讀取文件的內(nèi)容并復(fù)制到 String 對象中
String result = new String(bufferedInputStream.readAllBytes());
System.out.println(result);
- DataInputStream:用于讀取指定類型數(shù)據(jù),不能單獨使用,必須結(jié)合 FileInputStream
FileInputStream fileInputStream = new FileInputStream("input.txt");
//必須將fileInputStream作為構(gòu)造參數(shù)才能使用
DataInputStream dataInputStream = new DataInputStream(fileInputStream);
//可以讀取任意具體的類型數(shù)據(jù)
dataInputStream.readBoolean();
dataInputStream.readInt();
dataInputStream.readUTF();
- ObjectInputStream:用于從輸入流中讀取Java對象(反序列化)
ObjectInputStream input = new ObjectInputStream(new FileInputStream("object.data"));
MyClass object = (MyClass) input.readObject();
input.close();
2、OutputStream(字節(jié)輸出流)
1、OutputStream: 用于將數(shù)據(jù)(字節(jié)信息)寫入到目的地(通常是文件)
2、常用方法
- write(int b) :將特定字節(jié)寫入輸出流。
- flush() :刷新此輸出流并強制寫出所有緩沖的輸出字節(jié)。
- close() :關(guān)閉輸出流釋放相關(guān)的系統(tǒng)資源。
3、常用子類
- FileOutputStream:最常用的字節(jié)輸出流對象,可直接指定文件路徑,可以直接輸出單字節(jié)數(shù)據(jù),也可以輸出指定的字節(jié)數(shù)組
- BufferedOutputStream:字節(jié)緩沖輸出流
FileOutputStream fileOutputStream = new FileOutputStream("output.txt");
BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream)
- DataOutputStream :用于寫入指定類型數(shù)據(jù),不能單獨使用,必須結(jié)合 FileOutputStream
- ObjectOutputStream:將對象寫入到輸出流(序列化)
4、字符流
字符流默認采用的是 Unicode 編碼,我們可以通過構(gòu)造方法自定義編碼
1、Reader(字符輸入流)
**1、Reader:**用于從源頭(通常是文件)讀取數(shù)據(jù)(字符信息)到內(nèi)存中
2、常用方法:
- read() : 從輸入流讀取一個字符
- skip(long n) :忽略輸入流中的 n 個字符 ,返回實際忽略的字符數(shù)。
- close() : 關(guān)閉輸入流并釋放相關(guān)的系統(tǒng)資源
3、常用子類
- FileReader:InputStreamReader 是字節(jié)流轉(zhuǎn)換為字符流的橋梁,其子類 FileReader 是基于該基礎(chǔ)上的封裝,可以直接操作字符文件
FileReader fileReader = new FileReader("input.txt");
2、Writer(字符輸出流)
**1、Writer:**用于將數(shù)據(jù)(字符信息)寫入到目的地(通常是文件)
2、常用方法:
- write(int c) : 寫入單個字符
- write(String str) :寫入字符串
- append(char c) :將指定的字符附加到指定的 Writer 對象并返回該 Writer 對象
- flush() :刷新此輸出流并強制寫出所有緩沖的輸出字符。
- close():關(guān)閉輸出流釋放相關(guān)的系統(tǒng)資源
3、常用子類
- FileWriter:OutputStreamWriter 是字符流轉(zhuǎn)換為字節(jié)流的橋梁,其子類 FileWriter 是基于該基礎(chǔ)上的封裝,可以直接將字符寫入到文件
try (Writer output = new FileWriter("output.txt")) {output.write("你好,我是Guide。");
} catch (IOException e) {e.printStackTrace();
}
5、字節(jié)緩沖流
1、字節(jié)緩沖流: IO 操作是很消耗性能的,緩沖流將數(shù)據(jù)加載至緩沖區(qū),一次性讀取/寫入多個字節(jié),從而避免頻繁的 IO 操作,提高流的傳輸效率
**2、和字節(jié)流的性能差別:**字節(jié)流和字節(jié)緩沖流的性能差別主要體現(xiàn)在我們使用兩者的時候都是調(diào)用 write(int b) 和 read() 這兩個一次只讀取一個字節(jié)的方法的時候。由于字節(jié)緩沖流內(nèi)部有緩沖區(qū)(字節(jié)數(shù)組),因此,字節(jié)緩沖流會先將讀取到的字節(jié)存放在緩存區(qū),大幅減少 IO 次數(shù),提高讀取效率
3、常用類: BufferedInputStream(字節(jié)緩沖輸入流)和BurreredOutputStream(字節(jié)緩沖輸出流)
6、字符緩沖流
BufferedReader (字符緩沖輸入流)和 BufferedWriter(字符緩沖輸出流): 類似于 BufferedInputStream(字節(jié)緩沖輸入流)和BufferedOutputStream(字節(jié)緩沖輸入流),內(nèi)部都維護了一個字節(jié)數(shù)組作為緩沖區(qū)
7、打印流
- System.out 實際是用于獲取一個 PrintStream 對象,print方法實際調(diào)用的是 PrintStream 對象的
write 方法。
System.out.println("Hello!");
- PrintStream 屬于字節(jié)打印流,與之對應(yīng)的是 PrintWriter (字符打印流)。
參考
- https://javaguide.cn/java/io/io-basis.html