IO流概览
使用流后,一定要記得關(guān)閉,不然會一直保持內(nèi)存與某個文件的通話。舉個栗子,如果你向某個文件里傳了數(shù)據(jù)后沒close(),則你想刪除這個文件,那么系統(tǒng)會提示你該文件正被某個程序使用而無法刪除。
1. IO流模型
本來是有一張圖片描述的,因為該博客相對來說十分不完美,用戶體驗也一般般,只能寫兩句文字代替了:
輸入流:由硬盤或是其他存儲的數(shù)據(jù)向電腦內(nèi)存發(fā)送產(chǎn)生的數(shù)據(jù)流。 輸出流:由電腦內(nèi)存向硬盤等其他地方發(fā)送數(shù)據(jù)產(chǎn)生的流。所以IO流的里的輸入輸出是針對內(nèi)存來說的。
InputStream和Reader的移動記錄指針的方法:
void mark(int readAheadLimit): //在記錄指針當(dāng)前位置記下一個標(biāo)記(mark)。 void reset(): //將此輸入流的記錄指針重新定位到上一次記錄標(biāo)記(mark)的位置。 long skip(long n): //記錄指針向前移動n個字節(jié)/字符 boolean markSupported(): //判斷此輸入流是否支持mark()操作,即是否技持記錄標(biāo)記。2.節(jié)點流: 可以向一個特定的設(shè)備(硬盤、網(wǎng)絡(luò))讀/寫數(shù)據(jù)的流。都以物理IO節(jié)點為構(gòu)造器參數(shù)。
常見節(jié)點流:
文 件: FileInputStream FileOutputStrean FileReader FileWriter
數(shù) 組: ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter
字符串:StringReader StringWriter
管 道:PipedInputStream PipedOutputStream PipedReader PipedWriter
3.處理流:對已經(jīng)存在的流(節(jié)點流)進(jìn)行連接或封裝后再實現(xiàn)讀寫。 使用處理流的好處是,使用同一處理流,可訪問不同節(jié)點流。以存在的流為構(gòu)造器參數(shù)。關(guān)閉處理流時,被包裝的節(jié)點流自動關(guān)閉。
常見處理流:
緩沖流:BufferedInputStream、BufferedOutputStream,BufferedReader BufferedWriter
轉(zhuǎn)換流:InputStreamReader OutputStreamWriter
數(shù)據(jù)流:DataInputStream DataOutputStream
推回輸入流:PushbackInputStream,PushbackReader
其他:PrintStream
4.字節(jié)流: 操作的數(shù)據(jù)單元是8位字節(jié),以InputStreamt、OutputStream作為基類。
5 字符流:操作的數(shù)據(jù)單元是16位的字符,以Reader、Writer為基類。
6.輸入流的方法:
int read(): //讀取單個字節(jié)或字符,返回讀取的字節(jié)(字符)數(shù)據(jù),該數(shù)據(jù)可直接轉(zhuǎn)為int型。用read()方法讀取GBK方式保存文件時,由于中文是兩個字節(jié)組成的, 而read()每次只讀了一個字節(jié),所以會出現(xiàn)亂碼問題。int read(byte[] b): //讀取b.length個字節(jié),存在字節(jié)數(shù)組b中。返回的是讀取的字節(jié)個數(shù),讀到末尾返回-1。int read(char[] c): //與上面用法一樣,區(qū)別只是上面的方法讀的是字節(jié),而它讀的字符。7 輸出流的方法:
void write(int c)://將字節(jié)/字符c輸出到輸出流中。void write(byte[]/char[] buff)://將字節(jié)/字符緩沖數(shù)組中的數(shù)據(jù)輸出到輸出流中。由于Writer類以字符為操作單位,所以它還有自己的方法:void write(String str)://將字符串直接輸出到輸出流中。void write(String str,int off ,int length)://將字符串str從off開始輸出length個字符到輸出流中。8.與JDBC編程一樣,程序打開的文件IO資源不屬于內(nèi)存里的資源,垃圾回收機(jī)制無法回收該資源,所以應(yīng)該顯示關(guān)閉。
Java7改寫了所有IO資源,都實現(xiàn)了AutoCloseable接口,因此都可自動關(guān)閉資源的try語句來關(guān)閉IO流。如:
try(FileReader reader = new FileReader("test.java"););//即在try()里的IO流都會自動關(guān)閉。9.轉(zhuǎn)換流:將字節(jié)流轉(zhuǎn)為字符流。InputStreamReader、OutputStreamReader,如:
InputStreamReader reader = new InputStreamReader(System.in);//標(biāo)準(zhǔn)輸入(System.in)即鍵盤輸入是InputStream的實例,所以是字節(jié)流。只有將字節(jié)流轉(zhuǎn)為字符流的轉(zhuǎn)換流,因為操作字符流更方便。
10.推回輸入流:PushbackReader、PushbackInputStream
void unread(int c)://將字節(jié)/字符c推回到緩沖區(qū)里,從而允許緩沖區(qū)重復(fù)讀c。 void unread(byte[] /char[] buff): //將buff數(shù)組推回到緩沖區(qū)里,從而允許緩沖區(qū)重復(fù)讀取該數(shù)組。 void unread(byte[] /char[] ,int off,int len)://將字節(jié)/字符數(shù)組的數(shù)據(jù)從off開始推回len個到緩沖區(qū)里,從而可從緩沖區(qū)重復(fù)讀。 推回輸入流的三個read方法,與對應(yīng)的InputStream 和 Reader的一樣。例:
PushbackReader back = new PushbackReader(new FileReader("test.java"),99);//創(chuàng)建緩沖區(qū)長度為99的 PushbackReader對象 char[] buff = new char[32];//創(chuàng)建存儲讀取數(shù)據(jù)的容器 String content = new String(buff,0,back.read(buff));//讀一次數(shù)據(jù)存在buff里,并轉(zhuǎn)為 String back.unread(content.toCharArray());//將剛剛讀的內(nèi)容轉(zhuǎn)為char數(shù)組后推回back緩沖區(qū)輸入流中 String content2 = new String(buff,0,back.read(buff));//再次從back的緩沖區(qū)里讀取11.重定向標(biāo)準(zhǔn)輸入輸出:
System.out和System.in在默認(rèn)情況下分別代表輸出到顯示器上(控制臺)和鍵盤輸入。
System類提供了以下三個重定向的靜態(tài)方法 :
12.java.io包下還有以下可能會用到的字節(jié)點:
AudioInputStream、CiperInputSteam、DeflaterInputStream、ZipInputStream等具有訪問音頻文件、加密、壓縮、解壓功能的字節(jié)流。
總結(jié)
- 上一篇: AngularJS相关网站存档
- 下一篇: 多线程情况下创建连接池