在本教程中,我們將借助示例學(xué)習(xí)Java BufferedInputStream及其方法。
java.io包的BufferedInputStream類與其他輸入流一起使用,以更有效地讀取數(shù)據(jù)(以字節(jié)為單位)。
它繼承了InputStream抽象類。
BufferedInputStream維護(hù)一個(gè)8192字節(jié)的內(nèi)部緩沖區(qū)。
在BufferedInputStream中進(jìn)行讀取操作期間,會從磁盤讀取一部分字節(jié)并將其存儲在內(nèi)部緩沖區(qū)中。 并從內(nèi)部緩沖區(qū)中逐個(gè)讀取字節(jié)。
因此,減少了與磁盤的通信次數(shù)。這就是為什么使用BufferedInputStream讀取字節(jié)更快。
為了創(chuàng)建一個(gè)BufferedInputStream,我們必須首先導(dǎo)入java.io.BufferedInputStream包。導(dǎo)入包后,便可以在此處創(chuàng)建輸入流。
//創(chuàng)建一個(gè)FileInputStream FileInputStream file = new FileInputStream(String path); //創(chuàng)建一個(gè)BufferedInputStream BufferedInputStream buffer = new BufferInputStream(file);
在上面的示例中,我們創(chuàng)建了一個(gè)名為BufferdInputStream的buffer,并使用名為file的FileInputStream創(chuàng)建了一個(gè)文件。
在此,內(nèi)部緩沖區(qū)的默認(rèn)大小為8192字節(jié)。但是,我們也可以指定內(nèi)部緩沖區(qū)的大小。
//創(chuàng)建一個(gè)具有指定大小的內(nèi)部緩沖區(qū)的BufferedInputStream BufferedInputStream buffer = new BufferInputStream(file, int size);
buffer將有助于更快地從文件讀取字節(jié)。
BufferedInputStream類為InputStream類中提供的不同方法提供實(shí)現(xiàn)。
read() - 從輸入流中讀取一個(gè)字節(jié)
read(byte[] arr) - 從流中讀取字節(jié)并存儲在指定的數(shù)組中
read(byte[] arr, int start, int length) - 從流中讀取等于length的字節(jié)數(shù),并從位置start開始存儲在指定的數(shù)組中
假設(shè)我們有一個(gè)名為input.txt的文件,其中包含以下內(nèi)容。
This is a line of text inside the file.
讓我們嘗試使用讀取文件BufferedInputStream。
import java.io.BufferedInputStream; import java.io.FileInputStream; class Main { public static void main(String[] args) { try { //創(chuàng)建一個(gè)FileInputStream FileInputStream file = new FileInputStream("input.txt"); //創(chuàng)建一個(gè)BufferedInputStream BufferedInputStream input = new BufferedInputStream(file); //從文件中讀取第一個(gè)字節(jié) int i = input .read(); while (i != -1) { System.out.print((char) i); //從文件中讀取下一個(gè)字節(jié) i = input.read(); } input.close(); } catch (Exception e) { e.getStackTrace(); } } }
輸出結(jié)果
This is a line of text inside the file.
在上面的示例中,我們創(chuàng)建了一個(gè)名為buffer的緩沖輸入流和FileInputStream。輸入流與文件input.txt鏈接。
FileInputStream file = new FileInputStream("input.txt"); BufferedInputStream buffer = new BufferedInputStream(file);
在這里,我們使用了read()方法從緩沖讀取器的內(nèi)部緩沖區(qū)讀取字節(jié)數(shù)組。
要獲取輸入流中可用字節(jié)的數(shù)量,我們可以使用available()方法。例如,
import java.io.FileInputStream; import java.io.BufferedInputStream; public class Main { public static void main(String args[]) { try { //假設(shè)input.txt文件包含以下文本 //這是文件中的一行文本。 FileInputStream file = new FileInputStream("input.txt"); //創(chuàng)建一個(gè)BufferedInputStream BufferedInputStream buffer = new BufferedInputStream(file); //返回可用的字節(jié)數(shù) System.out.println("開始時(shí)可用的字節(jié)數(shù): " + buffer.available()); //從文件中讀取字節(jié) buffer.read(); buffer.read(); buffer.read(); //返回可用的字節(jié)數(shù) System.out.println("結(jié)束時(shí)的可用字節(jié)數(shù): " + buffer.available()); buffer.close(); } catch (Exception e) { e.getStackTrace(); } } }
輸出結(jié)果
開始時(shí)可用的字節(jié)數(shù): 39 結(jié)束時(shí)的可用字節(jié)數(shù): 36
在以上示例中,
我們首先使用available()方法檢查輸入流中可用字節(jié)的數(shù)量。
然后,我們使用read()方法3次從輸入流中讀取3個(gè)字節(jié)。
現(xiàn)在,在讀取字節(jié)之后,我們再次檢查了可用字節(jié)。這一次可用字節(jié)減少了3。
要丟棄和跳過指定的字節(jié)數(shù),可以使用skip()方法。例如
import java.io.FileInputStream; import java.io.BufferedInputStream; public class Main { public static void main(String args[]) { try { //假設(shè)input.txt文件包含以下文本 //這是文件中的一行文本。 FileInputStream file = new FileInputStream("input.txt"); //創(chuàng)建一個(gè)BufferedInputStream BufferedInputStream buffer = new BufferedInputStream(file); //跳過5個(gè)字節(jié) buffer.skip(5); System.out.println("跳過5個(gè)字節(jié)后的輸入流:"); //從輸入流中讀取第一個(gè)字節(jié) int i = buffer.read(); while (i != -1) { System.out.print((char) i); //從輸入流中讀取下一個(gè)字節(jié) i = buffer.read(); } //關(guān)閉輸入流 buffer.close(); } catch (Exception e) { e.getStackTrace(); } } }
輸出結(jié)果
跳過5個(gè)字節(jié)后的輸入流: is a line of text inside the file.
在上面的示例中,我們使用過skip()方法從文件輸入流中跳過5個(gè)字節(jié)。 因此,從輸入流中跳過字節(jié)“ T”,“ h”,“ i”,“ s”和“ ”。
要關(guān)閉緩沖的輸入流,我們可以使用close()方法。 一旦調(diào)用close()方法,我們將無法使用輸入流讀取數(shù)據(jù)。
方法 | 內(nèi)容描述 |
---|---|
mark() | 標(biāo)記輸入流中已讀取數(shù)據(jù)的位置 |
reset() | 將控件返回到輸入流中設(shè)置了標(biāo)記的點(diǎn) |