一、什麼是InputStream
InputStream是Java中一個抽象類,它是所有字節輸入流的父類。它提供了一種方法來讀取字節流並從中提取數據。
通常情況下,我們讀取文件都使用InputStream,因為文件是以字節為單位組織的。如果我們需要讀取網絡傳輸或者其他非文件相關的字節流,也可以使用InputStream。
需要注意的是,InputStream並不是線程安全的,在多線程環境下需要使用同步機制。
二、簡單示例
File file = new File("test.txt"); InputStream is = new FileInputStream(file); int data = is.read(); while(data != -1){ //處理讀取到的數據 process(data); data = is.read(); } is.close();
以上示例演示了如何使用InputStream讀取文件內容。我們首先通過FileInputStream創建一個輸入流is,然後反覆調用is.read()方法以讀取文件中的每個字節。當is.read()方法返回-1時,就說明文件已經讀完。最後我們需要關閉流。
三、BufferedInputStream
InputStream的一個問題是,每次調用read()方法時,都會從磁盤讀取一個字節,這個過程非常耗時。為了提高性能,我們可以使用BufferedInputStream。BufferedInputStream是一個帶緩衝區的InputStream,它通過一次性從磁盤讀取一定數量的字節來提高效率。
File file = new File("test.txt"); InputStream is = new BufferedInputStream(new FileInputStream(file)); int data = is.read(); while(data != -1){ //處理讀取到的數據 process(data); data = is.read(); } is.close();
以上代碼演示了如何使用BufferedInputStream讀取文件內容。實際上,我們只需要在創建InputStream時,將FileInputStream包裝成BufferedInputStream即可。這個過程稱之為“裝飾器模式”。
四、DataInputStream
InputStream只能讀取字節流,但有時我們需要從流中讀取其他類型的數據,例如整數、浮點數或布爾值。這時,我們可以使用DataInputStream。
File file = new File("test.txt"); InputStream is = new FileInputStream(file); DataInputStream dis = new DataInputStream(is); while(dis.available() > 0){ //讀取數據並處理 int n = dis.readInt(); process(n); } dis.close();
以上代碼演示了如何使用DataInputStream讀取整數。我們首先創建一個FileInputStream,然後將它包裝成DataInputStream。在讀取整數時,我們需要調用readInt()方法。需要注意的是,DataInputStream也不是線程安全的。
五、內存映射文件
InputStream讀取大文件時,會佔用大量的內存,不方便操作。為此,Java提供了一種基於內存映射文件的方式來讀取文件。內存映射文件會將文件直接映射到內存中,可以像讀取普通數組一樣讀取。
File file = new File("test.txt"); RandomAccessFile raf = new RandomAccessFile(file, "r"); FileChannel fc = raf.getChannel(); MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_ONLY, 0, file.length()); while(mbb.hasRemaining()){ //逐個讀取字符 char ch = (char)mbb.get(); process(ch); }
以上代碼演示了如何使用內存映射文件來讀取文件內容。我們首先通過RandomAccessFile創建一個FileChannel,然後調用map()方法將文件映射到一個MappedByteBuffer中。最後,我們可以通過逐個讀取字節的方式來讀取文件內容。
六、小結
本文介紹了Java中以InputStream為中心的文件讀取方式。我們首先學習了InputStream的基本用法,然後介紹了如何使用BufferedInputStream和DataInputStream來提高效率和讀取其他類型的數據。最後,我們介紹了如何使用內存映射文件來讀取大文件。
原創文章,作者:ILYC,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/134247.html