剛好在看深入Java web技術(shù)內(nèi)幕這本書,書里提到了Java IO,之前日常的工作中一直對(duì)各種IO類之間的關(guān)系理不清楚,正好趁此機(jī)會(huì)走讀下源碼做下總結(jié)
IO類
人類識(shí)別字符,機(jī)器識(shí)別字節(jié)蚤认,如果需要對(duì)字符進(jìn)行機(jī)器間的傳輸,需要將字符向字節(jié)進(jìn)行轉(zhuǎn)化糕伐,Java針對(duì)2種數(shù)據(jù)格式砰琢,有不同的IO類:
- 基于字節(jié)操作的IO接口:InputStream和OutputStream
由于OutputStream和InputStream的相對(duì)關(guān)系,我們只講InputStream
InputStream 是所有字節(jié)輸入類的基類,它的作用就是從輸入源讀取字節(jié)到內(nèi)存
類層次結(jié)構(gòu)如下:
- 基于字符操作的IO接口:Writer和Reader
Reader 是所有字符輸入類的基類陪汽,它的作用就是從輸入源讀取字符到內(nèi)存
類層次結(jié)構(gòu)如下:
InputStream/Reader/InputStreamReader3者之間的關(guān)系:
1.InputStreamReader是字節(jié)流和字符流之間的橋梁训唱,InputStreamReader繼承了Reader類,InputStreamReader的注釋如下:
An InputStreamReader is a bridge from byte streams to character streams: It reads bytes and decodes them into characters using a specified {@link java.nio.charset.Charset charset}. The charset that it uses may be specified by name or may be given explicitly, or the platform's default charset may be accepted.
2.更直白的理解:InputStreamReader將InputStream中讀取的字節(jié)轉(zhuǎn)換為字符挚冤,下面的代碼將3者關(guān)系表現(xiàn)了出來(lái):
// 創(chuàng)建字節(jié)輸入流
FileInputStream fi = new FileInputStream("/Users/ali/10_python/get-pip.py");
// 字節(jié)輸入流向字符輸入流轉(zhuǎn)換
InputStreamReader ir = new InputStreamReader(fi, "UTF-8");
// 從InputStreamReader中讀取到BufferedReader况增,實(shí)現(xiàn)高效的字符行讀取
BufferedReader br = new BufferedReader(ir);
StringBuilder contentBuffer = new StringBuilder();
String line = "";
while ((line = br.readLine()) != null) {
contentBuffer.append(line);
System.out.println(line);
}