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