首先文本數據建議直接考慮字符流(Reader\Writer)數組
非文本則只能用字節流(InputStream\OutputStream)網絡
---------------------------------------------------------------------------------多線程
管道流。dom
PipedInputStream函數
PipedOutputStreamspa
特色:讀取管道流和寫入管道流能夠進行鏈接。線程
鏈接方式: 1:經過兩個流對象的構造函數; 2:經過兩個對象的connect方法。指針
一般兩個流在使用時,須要加入多線程技術,也就是讓讀寫同時運行。對象
注意:對於read()方法。該方法是阻塞式的,也就是沒有數據的時候,該方法也會等待。接口
---------------------------------------------------------------------------------
對象的序列化
ObjectInputStream
ObjectOutputStream
能夠經過這兩個流對象直接操做已有對象而且將對象進行本地持久化存儲。
存儲後的對象能夠進行網絡傳輸。
兩個對象的特有方法:
ObjectInputStream Object readObject():
該方法拋出異常:ClassNotFountException;
ObjectOutputStream void writeObject(Object);
被寫入的對象必須實現一個接口:Serializable 不然會拋出:NotSerializableException
Serializable:該接口其實就是一個沒有方法的標記接口。
用於給類指定一個UID。該UID是經過類中的可序列化成員的數字簽名運算出來的一個long型的值。
只要是這些成員沒有變化,那麼該值每次運算都同樣。
該值用於判斷被序列化的對象和類文件是否兼容。
若是被序列化的對象須要被不一樣的類版本所兼容。能夠在類中自定義UID.
定義方式:static final long serialVersionUID = 42L;
注意:對於靜態的成員變量,不會被序列化。
對應非靜態也不想被序列化的成員而言,能夠經過transient關鍵字修飾。
一般,這兩個對象成對使用。
---------------------------------------------------------------------------------
操做基本數據類型的流對象
DataInputStream(InputStream);
方法:
int readInt();一次讀取四個字節,並將其轉成int值。
boolean readBoolean():一次讀取一個字節。
short readShort();
long readLong();
還有其它。。。
Sting readUTF();按照utf-8修改版讀取字符。注意,它只讀writeUTF()寫入的字符數據。
DataOutputStream(OutputStream);
方法:
writeInt(int):一次寫入四個字節。注意和write(int)不一樣,write(int)只將該整數的最低一個8位寫入。剩餘三個8位丟棄。
writeBoolean(boolean);
writeShort(short);
writeLong(long);
還有其它。。。
writeUTF(String):按utf-8修改版將字符數據存儲。只能經過readUTF讀取
一般成對出現 ;一般只要操做基本數據類型的數據。就須要經過 DataStream 進行包裝。
-----------------------------------------------------------------------------------
操做數組的流對象
字節數組
ByteArrayInputStream
ByteArrayOutputStream
字符數組
CharArrayReader
CharArrayWriter
對於這些流,源是內存,目的也是內存
並且這些流並未調用系統資源。使用的就是內存中的數組。因此這些對象不須要close.
操做數組的讀取流在構造時,必需要明確一個數據源。因此要傳入相對應的數組
對於操做數組的寫入流,在構造函數可使用空參數。由於它內置了一個可變長度數組做爲緩衝區。
這幾個流的出現其實就是經過流的讀寫思想在操做數組。
相似的對象同理:
StringReader
StringWriter
-------------------------------------------------------------------------------------
RandomAccessFile:
該對象並非流體系中的一員。
該對象中封裝了字節流,同時還封裝了一個緩衝區(字節數組),經過內部的指針來操做數組中的數據。
該對象特色:
1:該對象只能操做文件,因此構造函數接收兩種類型的參數。
a:字符串路徑。
b:File對象。
2:該對象既能夠對文件進行讀取,也能夠寫入。
在進行對象實例化時,必需要指定的該對象的操做模式,r rw 等。
該對象中有能夠直接操做基本數據類型的方法。
該對象最有特色的方法:
skipBytes():跳過指定的字節數。
seek():指定指針的位置。
getFilePointer():獲取指針的位置。
經過這些方法,就能夠完成對一個文件數據的隨機的訪問
想讀哪裏就讀哪裏,想往哪裏寫就往哪裏寫。
該對象功能,能夠讀數據,能夠寫入數據,若是寫入位置已有數據,會發生數據覆蓋。
也就是能夠對數據進行修改。
在使用該對象時,建議數據都是有規則的。或者是分段的。
注意;該對象在實例化時,若是要操做的文件不存在,會自動創建。
若是要操做的文件存在,則不會創建,若是存在的文件有數據。
那麼在沒有指定位置的狀況下,寫入數據,會將文件開頭的數據覆蓋。
能夠用於多線程的下載,也就是經過多線程往一個文件中同時存儲數據。
-------------------------------------------------------------------------------------
序列流。也稱爲合併流。
SequenceInputStream:
特色:能夠將多個讀取流合併成一個流。這樣操做起來很方便。
原理:其實就是將每個讀取流對象存儲到一個集合中。最後一個流對象結尾做爲這個流的結尾。
兩個構造函數:
1:SequenceInputStream(InputStream in1,InputStream in2)
能夠將兩個讀取流合併成一個流。
2:SequenceInputStream(Enumeration<?extends InputStream> en)
能夠將枚舉中的多個流合併成一個流。