在本教程中,我們將借助示例學(xué)習(xí)Java ByteArrayInputStream及其方法。
java.io包的ByteArrayInputStream類可用于讀取輸入數(shù)據(jù)數(shù)組(以字節(jié)為單位)。
它繼承了InputStream抽象類。
注意:在ByteArrayInputStream中,使用字節(jié)數(shù)組創(chuàng)建輸入流。 它包括一個(gè)內(nèi)部數(shù)組,用于存儲(chǔ)該特定字節(jié)數(shù)組的數(shù)據(jù)。
為了創(chuàng)建字節(jié)數(shù)組輸入流,我們必須首先導(dǎo)入java.io.ByteArrayInputStream包。導(dǎo)入包后,就可以創(chuàng)建輸入流。
//創(chuàng)建一個(gè)ByteArrayInputStream來(lái)讀取整個(gè)數(shù)組 ByteArrayInputStream input = new ByteArrayInputStream(byte[] arr);
在這里,我們創(chuàng)建了一個(gè)輸入流,該輸入流從arr數(shù)組中讀取整個(gè)數(shù)據(jù)。但是,我們也可以創(chuàng)建僅從數(shù)組讀取一些數(shù)據(jù)的輸入流。
//創(chuàng)建一個(gè)ByteArrayInputStream來(lái)讀取數(shù)組的一部分 ByteArrayInputStream input = new ByteArrayInputStream(byte[] arr, int start, int length);
在這里,輸入流從數(shù)組的start位置開始讀取等于數(shù)組length的字節(jié)數(shù)。
ByteArrayInputStream類為InputStream類中提供的不同方法提供實(shí)現(xiàn)。
read() - 從輸入流中存在的數(shù)組中讀取單個(gè)字節(jié)
read(byte[] array) - 從輸入流中讀取字節(jié)并存儲(chǔ)在指定的數(shù)組中
read(byte[] array, int start, int length) - 從流中讀取等于length的字節(jié)數(shù),并從位置start開始存儲(chǔ)在指定的數(shù)組中
import java.io.ByteArrayInputStream; public class Main { public static void main(String[] args) { //創(chuàng)建一個(gè)字節(jié)數(shù)組 byte[] array = {1, 2, 3, 4}; try { ByteArrayInputStream input = new ByteArrayInputStream(array); System.out.print("從輸入流讀取的字節(jié): "); for(int i= 0; i < array.length; i++) { //讀取字節(jié) int data = input.read(); System.out.print(data + ", "); } input.close(); } catch(Exception e) { e.getStackTrace(); } } }
輸出結(jié)果
從輸入流讀取的字節(jié): 1, 2, 3, 4,
在上面的示例中,我們創(chuàng)建了一個(gè)名為input的字節(jié)數(shù)組輸入流。
ByteArrayInputStream input = new ByteArrayInputStream(array);
在此,輸入流包括來(lái)自指定數(shù)組的所有數(shù)據(jù)。為了從輸入流中讀取數(shù)據(jù),我們使用了read()方法。
要獲取輸入流中可用字節(jié)的數(shù)量,我們可以使用available()方法。例如,
import java.io.ByteArrayInputStream; public class Main { public static void main(String args[]) { //創(chuàng)建字節(jié)數(shù)組 byte[] array = { 1, 2, 3, 4 }; try { ByteArrayInputStream input = new ByteArrayInputStream(array); //返回可用的字節(jié)數(shù) System.out.println("開始時(shí)的可用字節(jié)數(shù): " + input.available()); //從輸入流中讀取兩個(gè)字節(jié) input.read(); input.read(); //返回可用的字節(jié)數(shù) System.out.println("結(jié)束時(shí)的可用字節(jié)數(shù): " + input.available()); input.close(); } catch (Exception e) { e.getStackTrace(); } } }
輸出結(jié)果
開始的可用字節(jié)數(shù): 4 結(jié)束時(shí)的可用字節(jié)數(shù): 2
在以上示例中,
我們已經(jīng)使用該available()方法檢查輸入流中可用字節(jié)的數(shù)量。
然后,我們使用該read()方法2次從輸入流中讀取2個(gè)字節(jié)。
現(xiàn)在,在讀取2個(gè)字節(jié)之后,我們檢查了可用字節(jié)。這次,可用字節(jié)減少了2。
要丟棄和跳過(guò)指定的字節(jié)數(shù),可以使用skip()方法。例如
import java.io.ByteArrayInputStream; public class Main { public static void main(String args[]) { //創(chuàng)建一個(gè)字節(jié)數(shù)組 byte[] array = { 1, 2, 3, 4 }; try { ByteArrayInputStream input = new ByteArrayInputStream(array); //使用skip()方法 input.skip(2); System.out.print("跳過(guò)2個(gè)字節(jié)后的輸入流: "); int data = input.read(); while (data != -1) { System.out.print(data + ", "); data = input.read(); } // close() 方法 input.close(); } catch (Exception e) { e.getStackTrace(); } } }
輸出結(jié)果
跳過(guò)2個(gè)字節(jié)后的輸入流: 3, 4,
在上面的示例中,我們使用skip()方法跳過(guò)輸入流中的2字節(jié)數(shù)據(jù)。因此,不會(huì)從輸入流中讀取1和2。
要關(guān)閉輸入流,可以使用close()方法。
但是,close()方法在ByteArrayInputStream類中不起作用。即使在close()方法被調(diào)用之后,我們也可以使用該類的方法。
方法 | 內(nèi)容描述 |
---|---|
finalize() | 確保close()方法被調(diào)用 |
mark() | 標(biāo)記輸入流中已讀取數(shù)據(jù)的位置 |
reset() | 將控件返回到輸入流中設(shè)置了標(biāo)記的點(diǎn) |
markSupported() | 檢查輸入流是否支持mark()和reset() |