1 什么是IO?
- 1 Java的IO機(jī)制有流IO和塊IO兩種,核心庫 java.io是大多數(shù)面向數(shù)據(jù)流的IO類的主要軟件包;核心庫 java.nio中采用的便是塊IO。流IO的好處是簡(jiǎn)單易用,缺點(diǎn)是效率較低。塊IO效率很高,但編程比較復(fù)雜。
- 2 流IO基于數(shù)據(jù)流進(jìn)行輸入輸出,這些數(shù)據(jù)流表示了字符或者字節(jié)數(shù)據(jù)的流動(dòng)序列。Java的流IO提供了讀寫數(shù)據(jù)的標(biāo)準(zhǔn)方法。在Java中任何數(shù)據(jù)源的對(duì)象都支持?jǐn)?shù)據(jù)流的方式進(jìn)行數(shù)據(jù)的讀寫。
- 3 Java 流IO模型使用Decorator模式,按功能劃分Stream,可以動(dòng)態(tài)裝配這些Stream,以便獲得需要的功能。例如,需要一個(gè)具有緩沖的文件輸入流,則應(yīng)當(dāng)組合使用FileInputStream和BufferedInputStream。
2 數(shù)據(jù)流的概念
-
1 數(shù)據(jù)流是一串連續(xù)不斷的數(shù)據(jù)的集合。流是一個(gè)很形象的概念,當(dāng)程序需要讀取數(shù)據(jù)的時(shí)候,就會(huì)開啟一個(gè)通向數(shù)據(jù)源的流;當(dāng)程序需要寫入數(shù)據(jù)的時(shí)候,就會(huì)開啟一個(gè)通向目的地的流。采用數(shù)據(jù)流的目的就是使得輸出輸入獨(dú)立于設(shè)備。
IO stream - 2 將數(shù)據(jù)從外存中讀取到內(nèi)存中的稱為輸入流。即輸入流是將數(shù)據(jù)源(鍵盤、文件、網(wǎng)絡(luò)…)中的數(shù)據(jù)讀入到程序的通信通道。
Input Stream - 3 將數(shù)據(jù)從內(nèi)存寫入外存中的稱為輸出流。即輸出流是將程序中的數(shù)據(jù)輸出到外界(顯示器、打印機(jī)、文件、網(wǎng)絡(luò)…)的通信通道。
Output Stream - 4 流序列中的數(shù)據(jù)既可以是未經(jīng)加工的原始二進(jìn)制數(shù)據(jù),也可以是經(jīng)一定編碼處理后符合某種格式規(guī)定的特定數(shù)據(jù)。
- 字節(jié)流:數(shù)據(jù)流中最小的數(shù)據(jù)單元是字節(jié)
- 字符流:數(shù)據(jù)流中最小的數(shù)據(jù)單元是字符, 以Unicode編碼,一個(gè)字符占用兩個(gè)字節(jié)。
- 5 流IO層次體系結(jié)構(gòu)
Java I/O主要包括如下幾個(gè)層次,包含三個(gè)部分:
1)流式部分即流IO的主體部分,如Input/OutputStrean類、Reader/Writer類和標(biāo)準(zhǔn)輸入輸出流等;
2)非流式部分主要包含一些輔助流式部分的類,如:File類、RandomAccessFile類和FileDescriptor類等;
3)其他類--文件讀取部分的與安全相關(guān)的類,如:SerializablePermission類、FileSystem類和Win32FileSystem類等。
3 字節(jié)流
3.1 輸入字節(jié)流
- 1 InputStream(二進(jìn)制格式操作): 為字節(jié)輸入流,它本身為一個(gè)抽象類,必須依靠其子類實(shí)現(xiàn)各種功能,此抽象類是表示字節(jié)輸入流的所有類的超類。 繼承自InputStream的流都是向程序中輸入數(shù)據(jù)的,且數(shù)據(jù)單位為字節(jié)(8bit)。
- 2 Inputstream類的常用子類
1) FileInputStream把一個(gè)文件作為InputStream,實(shí)現(xiàn)對(duì)文件的讀取操作
2) ByteArrayInputStream:把內(nèi)存中的一個(gè)緩沖區(qū)作為InputStream使用
3) StringBufferInputStream:把一個(gè)String對(duì)象作為InputStream
4) PipedInputStream:實(shí)現(xiàn)了pipe的概念,主要在線程中使用
5) SequenceInputStream:把多個(gè)InputStream合并為一個(gè)InputStream
- 3 Inputstream類中的常用方法
1) public abstract int read( ):讀取一個(gè)byte的數(shù)據(jù),返回值是高位補(bǔ)0的int類型值。若返回值=-1說明沒有讀取到任何字節(jié)讀取工作結(jié)束。
2) public int read(byte b[ ]):讀取b.length個(gè)字節(jié)的數(shù)據(jù)放到b數(shù)組中。返回值是讀取的字節(jié)數(shù)。該方法實(shí)際上是調(diào)用下一個(gè)方法實(shí)現(xiàn)的。
3) public int read(byte b[ ], int off, int len):從輸入流中最多讀取len個(gè)字節(jié)的數(shù)據(jù),存放到偏移量為off的b數(shù)組中。
4) public int available( ):返回輸入流中可以讀取的字節(jié)數(shù)。注意:若輸入阻塞,當(dāng)前線程將被掛起,如果InputStream對(duì)象調(diào)用這個(gè)方法的話,它只會(huì)返回0,這個(gè)方法必須由繼承InputStream類的子類對(duì)象調(diào)用才有用。
5) public long skip(long n):忽略輸入流中的n個(gè)字節(jié),返回值是實(shí)際忽略的字節(jié)數(shù), 跳過一些字節(jié)來讀取。
6) public int close( ) :我們?cè)谑褂猛旰螅仨殞?duì)我們打開的流進(jìn)行關(guān)閉。
3.2 輸出字節(jié)流
- 1 OutputStream(二進(jìn)制格式操作):抽象類?;谧止?jié)的輸出操作。是所有輸出流的父類。定義了所有輸出流都具有的共同特征。
- 2 Outputstream類的常用子類
- ByteArrayOutputStream:把信息存入內(nèi)存中的一個(gè)緩沖區(qū)中
- FileOutputStream:把信息存入文件中
- PipedOutputStream:實(shí)現(xiàn)了pipe的概念,主要在線程中使用
-
SequenceOutputStream:把多個(gè)OutStream合并為一個(gè)OutStream
- 3 Outputstream類中的常用方法
1)public void write(byte b[ ]):將參數(shù)b中的字節(jié)寫到輸出流。
2)public void write(byte b[ ], int off, int len) :將參數(shù)b的從偏移量off開始的len個(gè)字節(jié)寫到輸出流。
3)public abstract void write(int b) :先將int轉(zhuǎn)換為byte類型,把低字節(jié)寫入到輸出流中。
4)public void flush( ) : 將數(shù)據(jù)緩沖區(qū)中數(shù)據(jù)全部輸出,并清空緩沖區(qū)。
5)public void close( ) : 關(guān)閉輸出流并釋放與流相關(guān)的系統(tǒng)資源。
4 字符流
Java中字符是采用Unicode標(biāo)準(zhǔn),一個(gè)字符是16位,即一個(gè)字符使用兩個(gè)字節(jié)來表示。為此,JAVA中引入了處理字符的流。
4.1 輸入字符流
- 1 Reader抽象類,基于字符的輸入操作。子類必須實(shí)現(xiàn)的方法只有 read(char[], int, int) 和 close()。但是,多數(shù)子類將重寫此處定義的一些方法,以提供更高的效率和/或其他功能。
- 2 常用子類
1)FileReader :與FileInputStream對(duì)應(yīng)
2)CharArrayReader:與ByteArrayInputStream對(duì)應(yīng)
3)StringReader : 與StringBufferInputStream對(duì)應(yīng)
4)InputStreamReader 從輸入流讀取字節(jié),在將它們轉(zhuǎn)換成字符
5)FilterReader: 允許過濾字符流
6)BufferReader :接受Reader對(duì)象作為參數(shù),并對(duì)其添加字符緩沖器,使用readline()方法可以讀取一行。
- 3 常用方法
1)public int read() throws IOException; //讀取一個(gè)字符,返回值為讀取的字符
2)public int read(char cbuf[]) throws IOException; /讀取一系列字符到數(shù)組cbuf[]中,返回值為實(shí)際讀取的字符的數(shù)量/
3)public abstract int read(char cbuf[],int off,int len) throws IOException;
/讀取len個(gè)字符,從數(shù)組cbuf[]的下標(biāo)off處開始存放,返回值為實(shí)際讀取的字符數(shù)量,該方法必須由子類實(shí)現(xiàn)/
4.2 輸出字符流
- 1 Writer(文件格式操作):抽象類,基于字符的輸出操作。寫入字符流的抽象類。子類必須實(shí)現(xiàn)的方法僅有 write(char[], int, int)、flush() 和 close()。但是,多數(shù)子類將重寫此處定義的一些方法,以提供更高的效率和/或其他功能。
- 2 常用子類
1)FileWrite: 與FileOutputStream對(duì)應(yīng),將字符類型數(shù)據(jù)寫入文件,使用缺省字符編碼和緩沖器大小。
2)chararrayWrite:與ByteArrayOutputStream對(duì)應(yīng) ,將字符緩沖器用作輸出。
3)PrintWrite:生成格式化輸出。
4)FilterWriter:用于寫入過濾字符流。
5)PipedWriter:與PipedOutputStream對(duì)應(yīng)。
6)StringWriter:無與之對(duì)應(yīng)的以字節(jié)為導(dǎo)向的stream。
- 3 ** 常用方法**
1)public void write(int c) throws IOException; //將整型值c的低16位寫入輸出流
2)public void write(char cbuf[]) throws IOException; //將字符數(shù)組cbuf[]寫入輸出流
3)public abstract void write(char cbuf[],int off,int len) throws IOException; //將字符數(shù)組cbuf[]中的從索引為off的位置處開始的len個(gè)字符寫入輸出流
4)public void write(String str) throws IOException; //將字符串str中的字符寫入輸出流
5)public void write(String str,int off,int len) throws IOException; //將字符6)flush( ) //刷空輸出流,并輸出所有被緩存的字節(jié)。
7)close() 關(guān)閉流 public abstract void close() throws IOException。
5 如何選擇IO流?
- 1 確定是數(shù)據(jù)源和數(shù)據(jù)目的(輸入還是輸出)
源:輸入流 InputStream 或 Reader
目的:輸出流 OutputStream 或 Writer - 2 明確操作的數(shù)據(jù)對(duì)象是否是純文本
是:字符流Reader或Writer
否:字節(jié)流InputStream或OutputStream - 3 明確具體的設(shè)備。
1)硬盤文件:FileInputStream 或 FileReader,F(xiàn)ileOutputStream 或 FileWriter
2)內(nèi)存用數(shù)組byte[]:ByteArrayInputStream 或 ByteArrayOutputStream
3)char[]:CharArrayReader 或 CharArrayWriter
4)網(wǎng)絡(luò)用Socket流
5)鍵盤:System.in 或 System.out - 4 否需要轉(zhuǎn)換流
就使用轉(zhuǎn)換流InputStreamReader/OutputStreamWriter將Stream轉(zhuǎn)化為Reader/Writer - 5 否需要緩沖提高效率
就加上Buffered:BufferedInputStream/BufferedOuputStream,以及BuffereaReader/BufferedWriter。
6 IOException異常類的子類
- 1 public class EOFException :
非正常到達(dá)文件尾或輸入流尾時(shí),拋出這種類型的異常。 - 2 public class FileNotFoundException:
當(dāng)文件找不到時(shí),拋出的異常。 - 3 public class InterruptedIOException:
當(dāng)I/O操作被中斷時(shí),拋出這種類型的異常。







