標籤:text 方法 put 重新整理 網路io 多位元組 抽象方法 isp input
轉載請註明源出處:http://www.cnblogs.com/lighten/p/6964702.html
1.前言
電腦的IO操作一直都是比較重要的一環,IO顧名思義,就是輸入輸出資料流。不管是磁碟IO還是網路IO,資料流轉就離不開IO,理解Java的IO操作類很重要,本文介紹IO的抽象父類InputStream和OutputStream,這是Java的IO操作基礎,理解完抽象類別,對於其它的IO流也有很大的協助。
流都實現了Closeable介面,也就是都需要關閉。輸出資料流額外實現了一個Flushable方法,主要是通知立刻將資料刷入指定輸出地。
2.InputStream
1.read()方法是一個抽象方法,其是資料的讀取源頭,這個方法中要實現讀取資料,返回讀取的值。子類必須實現這個方法。
2.read(byte[])方法用處是將流的輸入讀入byte[]數組,其實際上調用的是read(byte[], int, int)。
3.read(byte[], int, int),將流讀入byte[]資料的第off個位置開始,讀取len個位元組。
上述就是讀入byte數組的全過程,先判斷參數的正確性,再讀取一個位元組,如果是-1則返回-1(流以-1判斷是否結束),然後放入數組的off位置,之後就迴圈讀,三種情況返回:1將所給的資料讀滿了,2讀取-1結束符,3出現讀取異常。最後返回數組所讀的資料個數。
4.skip(long),跳過指定個位元組不讀。
上述代碼很清楚,建立了一個跳過的緩衝資料,將流讀到這裡面去,跳過的位元組數有長度限制,為2048個。通過迴圈排除IO異常的感染,直到讀完或者讀滿要跳過的,然後返回實際跳過的數量。
5.available(),返回估測的可讀的數量,父類是直接返回了0。這個方法是對於所有流實現來說不都是準確的,所以慎用。這個方法需要被子類覆寫。單次讀或跳過很多位元組不會阻塞,但是可能會讀取或跳過少量位元組。
6.close(),關閉流,沒有具體實現。會釋放作業系統資源
7.mark(int),標記讀取位置,如果流實現支援,就可以重設位置,下次讀取則一模一樣。父類方法中什麼都沒做。使用之前要通過markSupported()方法判斷一下是否支援。
8.reset(),reset到mark方法最後一次調用的位置。父類不止mark,所以直接拋出IO異常。
9.markSupported(),用於判讀當前流是否支援標記流。與上兩個方法配套使用。
3.OutputStream
1.write(int),抽象方法,通常是寫入一個byte,低8位將寫入,高24位會被忽略。將指定位元組寫入輸出地,子類必須實現。
2.write(byte[]),實際上調用的就是方法3:write(b, 0, b.length);
3.write(byte b[], int off, int len),將位元組數組b的其實位置off開始,寫入len長度的位元組
很簡單的數組邊界判定,通過迴圈調用write(int)方法。
4.flush(),強制重新整理方法,將write寫出的位元組(此時不一定到了目的地如磁碟,可能在緩衝中),調用flush方法讓已寫緩衝位元組強制到目的地。父類方法沒有具體實現。但是此方法並不保證正在到了目的地,比如磁碟,檔案流,這個方法只保證之前寫入的資料到了作業系統的write方法,不保證作業系統完成了寫這個步驟。
5.close(),關閉輸出資料流。流關閉之後不能在輸出位元組,也不能再次開啟。父方法是抽象方法。
Java之IO(一)InputStream和OutputStream