一.IO流概念原理
1.在Java程序中器予,對于數(shù)據(jù)的輸入/輸出操作以“流” (stream) 方式進(jìn)行违帆;
2。J2SDK提供了各種各樣的“流”類莽鸭,用以獲取不同種類的數(shù)據(jù)吗伤;程序中通過標(biāo)準(zhǔn)的方法輸入或輸出數(shù)據(jù)。
3.Java的流類型一般位于http://java.io包中
二.流的分類
1.流的方向
輸入流:數(shù)據(jù)源流到程序(InputStream? Reader讀進(jìn)來)
輸出流:程序流到目的地(OutputStream? Writer寫出去)
2. 處理數(shù)據(jù)單元
字節(jié)流:按照字節(jié)讀取數(shù)據(jù)(InputStream OutputStream)
字符流:按照字符讀取數(shù)據(jù)(Reader Writer)
3. 功能不同
節(jié)點流:可以直接從數(shù)據(jù)源或目的地讀寫數(shù)據(jù)
處理流:不能直接連接到數(shù)據(jù)源或者目的地硫眨,是其他流進(jìn)行封裝足淆。目的是簡化操作和提高性能。
三.節(jié)點流和處理流的關(guān)系
1.節(jié)點流處于io操作的第一線礁阁,所有操作必須通過他們進(jìn)行;
2.處理流可以對其他流進(jìn)行處理(提高效率或操作靈活性).
四.IO流體系
1.InputStream和OutputStream
Java語言中最基本的兩個字節(jié)輸入輸出類姥闭。其他所有字節(jié)輸入輸出流類都繼承自這兩個基類。這兩個類都是抽象類棚品,不能創(chuàng)建它們的實例靠欢,只能使用它們的子類.
2. Reader和Writer
Java語言中最基本的兩個字符輸入輸出類门怪。其他所有字符輸入輸出流類都繼承自這兩個基類。這兩個類都是抽象類锅纺,不能創(chuàng)建它們的實例,只能使用它們的子類.
五.文件字節(jié)流
1.FileInputStream/FileOutputStream
概念:
FileInputStream通過字節(jié)的方式讀取文件,適合讀取所有類型的文件(圖像护锤、視頻、文本文件等)酿傍。Java也提供了FileReader專門讀取文本文件。
FileOutputStream 通過字節(jié)的方式寫數(shù)據(jù)到文件中拧粪,適合所有類型的文件沧侥。Java也提供了FileWriter專門寫入文本文件可霎。
方法:使用FileInputStream讀取文件內(nèi)容
1.abstract int read( );
2.int read( byte b[ ] );
3.int read( byte b[ ], int off, int len );
4.int available( );
5.close( );
使用FileOutputStream寫內(nèi)容到文件
1.abstract void write( int b );
2.void write( byte b[ ] );
3.void write( byte b[ ], int off, int len );
4.void flush( );
5.void close( );
六.文件字符流Reader/Writer
為什么要使用字符流:文件字節(jié)流可以處理所有的文件宴杀,但是字節(jié)流不能很好的處理Unicode字符癣朗,經(jīng)常會出現(xiàn)“亂碼”現(xiàn)象。所以旺罢,我們處理文本文件旷余,一般可以使用文件字符流,它以字符為單位進(jìn)行操作
方法使用Reader讀取文件內(nèi)容
1.int read( );
2.int read( char [ ]cbuf );
3.int read( char [ ]cbuf, int off, int len );
4.int available( );
5.close( );
使用Writer寫內(nèi)容到文件
1.void write( int c );
2.void write( char[]cbuf);
3.abstract void write( char [ ]cbuf, int off, int len );
4.void write(String str);
5.abstract void flush( );
6.void close( );
七.緩沖字節(jié)流_緩沖字符流
BufferedInputStream和BufferedOutputStream是處理流(包裝流)
作用:
讀文件和寫文件都使用了緩沖區(qū)扁达,減少了讀寫次數(shù)正卧,從而提高了效率
當(dāng)創(chuàng)建這兩個緩沖流的對象時時,會創(chuàng)建了內(nèi)部緩沖數(shù)組跪解,缺省使用32字節(jié)大小的緩沖區(qū).
當(dāng)讀取數(shù)據(jù)時炉旷,數(shù)據(jù)按塊讀入緩沖區(qū),其后的讀操作則直接訪問緩沖區(qū)
當(dāng)寫入數(shù)據(jù)時叉讥,首先寫入緩沖區(qū)窘行,當(dāng)緩沖區(qū)滿時,其中的數(shù)據(jù)寫入所連接的輸出流图仓。使用方法flush()可以強(qiáng)制將緩沖區(qū)的內(nèi)容全部寫入輸出流
關(guān)閉流的順序和打開流的順序相反.只要關(guān)閉高層流即可罐盔,關(guān)閉高層流其實關(guān)閉的底層節(jié)點流
Flush的使用:手動將buffer中內(nèi)容寫入文件
緩沖字符流
1.BufferedReader? ? ? ? readLine() 讀取一個文本行的數(shù)據(jù)
2.BufferedWriter? ? ? ? ? newLine();寫入一個行分隔符救崔。
使用緩沖字符流是復(fù)制文本文件常用的方式
八.轉(zhuǎn)換流InputStreamReader和OutputStreamWriter
作用:處理流? ? ? 用于將字節(jié)流轉(zhuǎn)化成字符流惶看,字符流與字節(jié)流之間的橋梁
InputStreamReader的作用是把InputStream轉(zhuǎn)換成Reader
OutputStreamWriter的作用是把OutputStream轉(zhuǎn)換成Writer
九.打印流PrintStream與PrintWriter
特點:PrintStream
1.PrintStream提供了一系列的print()和println(),可以實現(xiàn)將基本數(shù)據(jù)類型格式化成字符串輸出六孵。對象類型將先調(diào)用toString()碳竟,然后輸出該方法返回的字符串
2.System.out就是PrintStream的一個實例,代表顯示器
3.System.err 也是PrintStream的一個實例狸臣,代表顯示器
4.PrintStream的輸出功能非常強(qiáng)大莹桅,通常需要輸出文本內(nèi)容,都可以將輸出流包裝成PrintStream后進(jìn)行輸出
5.PrintStream的方法都不拋出IOException
PrintReader
1.PrintStream的對應(yīng)字符流,功能相同诈泼,方法對應(yīng)懂拾。
2.PrintWriter的方法也不拋出IOException
3.復(fù)制文件時可以使用PrintWriter代替BufferedWriter完成,更簡單
十.數(shù)據(jù)流DataInputStream和DataOutputStream
作用:數(shù)據(jù)流將“基本數(shù)據(jù)類型與字符串類型”作為數(shù)據(jù)源铐达,從而允許程序以與機(jī)器無關(guān)的方式從底層輸入輸出流中操作Java基本數(shù)據(jù)類型與字符串類型岖赋。
特點:
1.提供了可以存取所有Java基礎(chǔ)類型數(shù)據(jù)(如:int,double 等)和String的方法瓮孙。
2.處理流唐断,只針對字節(jié)流,二進(jìn)制文件
3.輸入流鏈和輸出流鏈
注意:只要關(guān)閉上層流即可