Java的IO系統是用來進行輸入和輸出的,Java系統本身提供了非常豐富的類庫,利用這些類庫幾乎可以進行一切
的IO操作,但要徹底弄明白這些類的用法和它們之間的關係卻並還容易,筆者總結了一些學習Java IO的思路,
希望對大家能有協助。
一、明白Input、Output、Read、Write、Stream的含義。
很多時候在Java中使用IO的時候,都是這幾個關鍵字交叉混合使用,一不小心就容易弄迷,要明這四個關鍵字,就要把握住一點,Java中IO的所有操作就是兩類,輸入和輸出,而所謂的輸入、輸出都是站在程式的角度而言的。
比如要通過一個程式,往硬碟中寫入一個檔案,對程式而言,肯定是程式在源源不斷的把資料往硬碟上放,對程式而言它是在Output,也就是在往出Write,所以Output總是Write對應,表達的是輸出的意思。
反過來,要通過一個程式把記憶體中的資料取出來,那麼程式要做的工作就是源源不斷的把記憶體中的資料往外拿,就要不斷的去讀,從程式的角度看,是有資料不斷的往程式裡放,這樣就是Input,它在Input的時需要不斷的Read,所以Input總是Read對應。
stream代表的是任何有能力產出資料的資料來源,或是任何有能力接收資料的接收源。在Java的IO中,所有的stream都包括Input和Output兩種類型。
二、JavaIo的分類
2.1對IO的分類:
所有JavaIO都可以分成兩類:
輸入資料流:
輸出資料流:
2.2對輸入輸出的分類:
所有的輸入資料流、輸出資料流都可以分為位元組(輸入、輸出)流,字元(輸入、輸出)流,處理位元組的主要是(OutputStream/InputStream) 系列,處理字元的,主要是(Reader/Write)系列
2.2.1以位元組(Byte)為導向的輸入資料流(InputStream系列):
1) ByteArrayInputStream:把記憶體中的一個緩衝區作為InputStream使用
2) StringBufferInputStream:把一個String對象作為InputStream
3) FileInputStream:把一個檔案作為InputStream,實現對檔案的讀取操作
4) PipedInputStream:實現了pipe的概念,主要線上程中使用
5) SequenceInputStream:把多個InputStream合并為一個InputStream
2.2.2以位元組(Byte)為導向的輸出資料流(OutputStream系列):
1) ByteArrayOutputStream:把資訊存入記憶體中的一個緩衝區中
2) FileOutputStream:把資訊存入檔案中
3) PipedOutputStream:實現了pipe的概念,主要線上程中使用
4) SequenceOutputStream:把多個OutStream合并為一個OutStream
2.2.3以Unicode字元為導向的輸入資料流(Reader系列):
1) CharArrayReader:與ByteArrayInputStream對應
2) StringReader:與StringBufferInputStream對應
3) FileReader:與FileInputStream對應
4) PipedReader:與PipedInputStream對應
2.2.4以Unicode字元為導向的輸出資料流(Write系列):
1) CharArrayWrite:與ByteArrayOutputStream對應
2) StringWrite:無與之對應的以位元組為導向的stream
3) FileWrite:與FileOutputStream對應
4) PipedWrite:與PipedOutputStream對應
2.3對所有流的修飾、轉換、封裝而設定的流(Filter系列)
“修飾”流(這是我在這裡起的一個形象的名字,文獻中沒有這種叫法)
輸入系列:
2.3.1 用於封裝以位元組為導向的,以下主要是用來修飾InputStream系列的各種輸入
1) DataInputStream: 從stream中讀取基本類型(int、char等)資料。
2) BufferedInputStream: 使用緩衝區
3) LineNumberInputStream:會記錄input stream內的行數,然後可以調用getLineNumber()和setLineNumber(int)
4) PushbackInputStream: 很少用到,一般用於編譯器開發
2.3.2 用於封裝以字元為導向的,以下主要是用來修飾Reader系列的各種輸入
1) 沒有與DataInputStream對應的類。除非在要使用readLine()時改用BufferedReader,否則使用
DataInputStream
2) BufferedReader:與BufferedInputStream對應
3) LineNumberReader:與LineNumberInputStream對應
4) PushBackReader:與PushbackInputStream對應
輸出系列:
2.3.3 用於封裝以位元組為導向的,主要用來修飾OutputStream系列的各種輸出
1) DataIOutStream:往stream中輸出基本類型(int、char等)資料。
2) BufferedOutStream:使用緩衝區
3) PrintStream:產生格式化輸出
2.3.4 用於封裝以字元為導向的,主要用來修飾Write系列的各種輸出
1) BufferedWrite:與對應
2) PrintWrite:與對應
三、一個特殊的類:RandomAccessFile
針對這個類,記住以下幾點:
1) 可通過RandomAccessFile對象完成對檔案的讀寫操作
2) 在產生一個對象時,可指明要開啟的檔案的性質:r,唯讀;w,唯寫;rw可讀寫
3) 可以直接跳到檔案中指定的位置
四、總結:
4.1、節點流類型(一根管直接插到下面的類型上,下面的管道指的是線程和線和之間的通訊)
4.2、分類表:
類型 字元流 位元組流
File FileReader FileInputStream
FileWriter FileOutputStream
Memory Array CharArrayReader ByteArrayInputStream
CharArrayWriter ByteArrayOutputStream
Memory String StringReader StringWriter
Pipe(管道) PipedReader PipedInputStream
PipedWriter PipedOutputStream
4.3、緩衝流要"套接"在相應的節點流之上,對讀寫的資料提供了緩衝的功能,提高了讀寫的效
對於輸出的緩衝流,寫出的資料會先在記憶體中緩衝,使用flush方法將會使內在中的資料立刻寫出
4.4、轉換流
InputStreamReader和OutputStreamWriter用與位元組資料到字元資料之間的轉換
InputStreamReader需要和InputStream"套接"
OutputStreamReader需要和OutputStream"套接"
在下一篇文章中,會找一些關於JavaIO操作的實際代碼,可以參考學習