1. 程式人生 > >Java IO: InputStream

Java IO: InputStream

try( InputStream inputstream = new FileInputStream("file.txt") ) {

    int data = inputstream.read();

    while(data != -1){

        System.out.print((char) data);

        data = inputstream.read();

    }

}

當執行執行緒退出try語句塊的時候,InputStream變數會被關閉。

read()

read()方法返回從InputStream流內讀取到的一個位元組內容(譯者注:0~255),例子如下:

int data = inputstream.read();

你可以把返回的int型別轉化成char型別:

char aChar = (char) data;

InputStream的子類可能會包含read()方法的替代方法。比如,DataInputStream允許你利用readBoolean(),readDouble()等方法讀取Java基本型別變數int,long,float,double和boolean。

流末尾

如果read()方法返回-1,意味著程式已經讀到了流的末尾,此時流內已經沒有多餘的資料可供讀取了。-1是一個int型別,不是byte或者char型別,這是不一樣的。

當達到流末尾時,你就可以關閉流了。

read(byte[])

InputStream包含了2個從InputStream中讀取資料並將資料儲存到緩衝陣列中的read()方法,他們分別是:

  • int read(byte[])
  • int read(byte, int offset, int length)

一次性讀取一個位元組陣列的方式,比一次性讀取一個位元組的方式快的多,所以,儘可能使用這兩個方法代替read()方法。

read(byte[])方法會嘗試讀取與給定位元組陣列容量一樣大的位元組數,返回值說明了已經讀取過的位元組數。如果InputStream內可讀的資料不足以填滿位元組陣列,那麼陣列剩餘的部分將包含本次讀取之前的資料。記得檢查有多少資料實際被寫入到了位元組陣列中。

read(byte, int offset, int length)方法同樣將資料讀取到位元組陣列中,不同的是,該方法從陣列的offset位置開始,並且最多將length個位元組寫入到陣列中。同樣地,read(byte, int offset, int length)方法返回一個int變數,告訴你已經有多少位元組已經被寫入到位元組陣列中,所以請記得在讀取資料前檢查上一次呼叫read(byte, int offset, int length)的返回值。

這兩個方法都會在讀取到達到流末尾時返回-1。

這是一個使用InputStream的read(byte[])的例子:

InputStream inputstream = new FileInputStream("c:\\data\\input-text.txt");

byte[] data = new byte[1024];

int bytesRead = inputstream.read(data);

while(bytesRead != -1) {

    doSomethingWithData(data, bytesRead);

    bytesRead = inputstream.read(data);

}

inputstream.close();

在程式碼中,首先建立了一個位元組陣列。然後宣告一個叫做bytesRead的儲存每次呼叫read(byte[])返回值的int變數,並且將第一次呼叫read(byte[])得到的返回值賦值給它。

在while迴圈內部,把位元組陣列和已讀取位元組數作為引數傳遞給doSomethingWithData方法然後執行呼叫。在迴圈的末尾,再次將資料寫入到位元組陣列中。

你不需要想象出read(byte, int offset, int length)替代read(byte[])的場景,幾乎可以在使用read(byte, int offset, int length)的任何地方使用read(byte[])。

輸入流和資料來源

一個輸入流往往會和資料來源聯絡起來,比如檔案,網路連線,管道等,更多細節已經在Java IO概述文章中介紹過了。