IO 所有輸入流的基類:InputStream / Reader 所有輸出流的基類:OutputStream / Writer 位元組流 InputStream常用方法:read(), skip(), available(), close() FileInputStream DataInputStre ...
IO
所有輸入流的基類:InputStream / Reader
所有輸出流的基類:OutputStream / Writer
位元組流
InputStream
常用方法:read(), skip(), available(), close()
-
FileInputStream
-
DataInputStream
: 用於讀取指定類型數據,不能單獨使用,必須結合其它流,比如FileInputStream
。 -
ObjectInputStream
: 從輸入流中讀取 Java 對象(反序列化) -
BufferedInputStream
OutputStream
常用方法:write(), flush(), close()
-
FileOutputStream
-
DataOutputStream
-
ObjectOutputStream
: 將對象寫入到輸出流 (序列化)。 -
BufferedOutputStream
常用字元編碼所占位元組數?utf8
:英文占 1 位元組,中文占 3 位元組,unicode
:任何字元都占 2 個位元組,gbk
:英文占 1 位元組,中文占 2 位元組。
字元流
Reader(字元輸入流)
Reader
用於讀取文本, InputStream
用於讀取原始位元組。
Reader
常用方法:read(), skip(), close()
位元組流轉換為字元流的橋梁:InputStreamReader
// 位元組流轉換為字元流的橋梁
public class InputStreamReader extends Reader {
}
// 用於讀取字元文件
public class FileReader extends InputStreamReader {
}
Writer(字元輸出流)
Writer
用於將數據(字元信息)寫入到目的地(通常是文件)Writer
常用方法:write(), append(), flush(), close()
字元流轉換為位元組流的橋梁:OutputStreamWriter
// 字元流轉換為位元組流的橋梁
public class OutputStreamWriter extends Writer {
}
// 用於寫入字元到文件
public class FileWriter extends OutputStreamWriter {
}
位元組緩衝流
BufferedInputStream
BufferedOutputStream
位元組緩衝流會先將讀取到的位元組存放在緩存區,大幅減少 IO 次數,提高讀取效率。
字元緩衝流
BufferedReader
BufferedWriter
列印流
PrintStream
PrintWriter
IO模型
BIO (Blocking I/O)同步阻塞IO模型
應用程式發起 read 調用後,會一直阻塞,直到內核把數據拷貝到用戶空間。
NIO (Non-blocking/New I/O)
同步非阻塞 IO 模型:應用程式會一直發起 read 調用,等待數據從內核空間拷貝到用戶空間的這段時間里,線程依然是阻塞的,直到在內核把數據拷貝到用戶空間。(通過輪詢操作,避免了一直阻塞。)
-
NIO 面向塊,I/O 面向流
-
非阻塞、面向緩衝、基於通道的 I/O,可以使用少量的線程來處理多個連接,大大提高了 I/O 效率和併發。
NIO核心組件:
-
Buffer(緩衝區)
-
Channel(通道):雙向的、可讀可寫的數據傳輸通道
-
Selector(選擇器)
NIO零拷貝:零拷貝是指電腦執行 IO 操作時,CPU 不需要將數據從一個存儲區域複製到另一個存儲區域,從而可以減少上下文切換以及 CPU 的拷貝時間。
AIO (Asynchronous I/O)
非同步 IO 模型:非同步 IO 是基於事件和回調機制實現的,也就是應用操作之後會直接返回,不會堵塞在那裡,當後臺處理完成,操作系統會通知相應的線程進行後續的操作。