java io體系介紹
前言
本文對java的io體系進行介紹。
1 總概
IO,Input/Output,輸入和輸出。
java的io處理分為兩類,一類為位元組流,一類為字元流。位元組流處理的頂層介面為InputStream和OutputStream,字元流處理的頂層介面為Writer和Reader。
2 InputStream
本節對InputStream及其體系進行介紹。
InputStream體系關係如下圖所示。
2.1 InputStream
輸入流的父類,提供read方法從stream中讀取位元組,有三種類型的read方法。
read(),讀取輸入流的下一個位元組,返回值為0到255,如果沒有,則會返回-1。該方法一直block直到有資料可讀。
read(byte b[]),從輸入流中讀取一定數量的位元組,位元組儲存在一個位元組陣列中。該方法一直block直到有資料可讀。
read(byte b[], int off, int len),從輸入流中讀取len長度的位元組,位元組儲存到一個位元組陣列中,off為讀取的第一個位元組在位元組陣列中的位置。該方法一直block直到有資料可讀。
2.2 ByteArrayInputStream
ByteArrayInputStream,內部包含一個buffer,buffer中儲存位元組,buffer由陣列實現。其read方法是同步的,內部有一個pos,代表著下一個要讀的位元組在buffer中的位置。
2.3 FileInputStream
FileInputStream,用於從File中讀取位元組,constructor可以是一個File物件,也可以是一個String,String表示的是File所在的路徑。
2.4 PipedInputStream
PipedInputStream,管道輸入流。一個管道輸入流應該連線到管道輸出流,然後管道輸入流可以讀取到寫入到管道輸出流中的資料。通常,一個執行緒可以從管道輸入流中讀取資料,而這些資料由其他對應的執行緒向管道輸出流中寫入。當連線到管道的執行緒不再alive時,管道將broken。
2.5 ObjectInputStream
ObjectInputStream,可以反序列化序列化到ObjectOutputStream中的obejct或者其他型別資料,提供readObejct方法,返回值為Obejct。
public static Object toObject(byte[] bytes) {
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(bais);
Object object = ois.readObject();
return object;
} catch(IOException ex) {
throw new RuntimeException(ex.getMessage(), ex);
} catch(ClassNotFoundException ex) {
throw new RuntimeException(ex.getMessage(), ex);
} finally {
try {
ois.close();
} catch (Exception e) {}
}
}
2.6 FilterInputStream
FilterInputStream,包含一些其他的輸入流,其一些子類提供輸入流處理的其他功能。其子類有BufferedInputStream,DataInputStream,PushbackInputStream,LineNumberInputStream。
BufferedInputStream,緩衝輸入支援和支援mark、reset操作,緩衝通過內部的一個byte陣列實現。
DataInputStream,支援應用程式從輸入流中讀取java的內部型別,例如int,char等。
PushbackInputStream,擁有一個Pushback緩衝區,可以將位元組推回而重新讀取。
LineNumberInputStream,已經Deprecated了。
2.7 其他
StringBufferInputStream,已經Deprecated。
SequenceInputStream,可以按順序讀取多個流。
3 OutputStream
OutputStream,輸出流,提供write方法寫入位元組到流中。本節對OutputStream及其體系進行介紹。
OutputStream相關類如下圖所示。