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概述文章中介紹過了。