Java利用InputStream類實現(xiàn)文件讀取與處理
今天我要給大家分享一些自己日常學(xué)習(xí)到的一些知識點,并以文字的形式跟大家一起交流,互相學(xué)習(xí),一個人雖可以走的更快,但一群人可以走的更遠(yuǎn)。
我是一名后端開發(fā)愛好者,工作日常接觸到最多的就是Java語言啦,所以我都盡量抽業(yè)余時間把自己所學(xué)到所會的,通過文章的形式進(jìn)行輸出,希望以這種方式幫助到更多的初學(xué)者或者想入門的小伙伴們,同時也能對自己的技術(shù)進(jìn)行沉淀,加以復(fù)盤,查缺補(bǔ)漏。
摘要
InputSteam類是Java中輸入流的抽象基類。InputStream類及其子類可以從不同的輸入源中讀取數(shù)據(jù),如文件、網(wǎng)絡(luò)、字節(jié)數(shù)組等。InputStream類提供了多個讀取數(shù)據(jù)的方法,可以讀取字節(jié)、字符、數(shù)組等不同類型的數(shù)據(jù)。InputStream類的常用子類有FileInputStream、ByteArrayInputStream等。
本文將深入解析InputStream類的源代碼實現(xiàn),并結(jié)合實際應(yīng)用場景進(jìn)行案例說明。同時,我們還將分析InputStream類的優(yōu)缺點,以及類方法的具體介紹和測試用例。
InputStream類
簡介
InputStream類是Java中所有輸入流的父類,它是一個抽象類。InputStream類提供了讀取不同類型數(shù)據(jù)的方法,如read()、read(byte[] b)、read(byte[] b, int off, int len)等,這些方法可以讀取字節(jié)、字符、數(shù)組等不同類型的數(shù)據(jù)。InputStream類的常用子類有FileInputStream、ByteArrayInputStream等。
下面是InputStream類的定義:
public abstract class InputStream implements Closeable { //... }
InputStream類定義了一個Closeable接口,該接口表示此輸入流已經(jīng)完成輸入操作,并且可以關(guān)閉此流。InputStream類的子類需要實現(xiàn)這個方法。
源代碼解析
InputStream類是Java中所有輸入流的父類,提供了讀取不同類型數(shù)據(jù)的方法。在InputStream類中,最重要的方法是read()方法。
read()方法可以讀取一個字節(jié)的數(shù)據(jù),并返回該字節(jié)的值。它的定義如下:
public abstract int read() throws IOException;
該方法會從輸入流中讀取一個字節(jié)的數(shù)據(jù),并將該字節(jié)的值返回。如果已經(jīng)到達(dá)輸入流的末尾,則返回-1。此方法可能會阻塞,直到輸入數(shù)據(jù)可用、檢測到文件結(jié)束或拋出異常為止。
在InputStream類中,還有另外兩個重要的方法,分別是read(byte[] b)和read(byte[] b, int off, int len)。其中,read(byte[] b)方法可以一次讀取多個字節(jié)的數(shù)據(jù),并將讀取的字節(jié)數(shù)據(jù)存儲到指定的字節(jié)數(shù)組中,而read(byte[] b, int off, int len)方法則可以讀取指定長度的字節(jié)數(shù)據(jù),并存儲到指定的字節(jié)數(shù)組中。
InputStream類還提供了mark(int readlimit)、reset()、available()等方法。其中,mark(int readlimit)方法允許輸入流在某個位置設(shè)置一個標(biāo)記,以便后續(xù)調(diào)用reset()方法時,輸入流可以回到該標(biāo)記處重新讀取數(shù)據(jù)。而reset()方法可以將輸入流指針重新設(shè)置到最近的標(biāo)記處。available()方法可以返回當(dāng)前可用的字節(jié)數(shù)。
如下是部分源碼截圖:
應(yīng)用場景案例
在Java中,InputStream類及其子類可以從不同的輸入源中讀取數(shù)據(jù),如文件、網(wǎng)絡(luò)、字節(jié)數(shù)組等。下面是一個小例子,演示如何從文件中讀取數(shù)據(jù):
import java.io.FileInputStream; import java.io.InputStream; public class InputStreamTest { public static void main(String[] args) throws Exception { InputStream input = new FileInputStream("test.txt"); int data = input.read(); while(data != -1){ System.out.println((char) data); data = input.read(); } input.close(); } }
在上述代碼中,我們首先通過FileInputStream類打開一個文件輸入流,接著使用InputStream類中的read()方法讀取文件數(shù)據(jù),并將每個字節(jié)轉(zhuǎn)化為字符輸出。最后,我們需要記得關(guān)閉輸入流,以釋放資源。
除了文件輸入流,我們還可以使用ByteArrayInputStream類從字節(jié)數(shù)組中讀取數(shù)據(jù)。下面是一個示例代碼:
import java.io.ByteArrayInputStream; import java.io.InputStream; public class ByteArrayInputStreamTest { public static void main(String[] args) throws Exception { byte[] data = "Hello World".getBytes(); InputStream input = new ByteArrayInputStream(data); int ch = input.read(); while(ch != -1){ System.out.println((char) ch); ch = input.read(); } input.close(); } }
在上述代碼中,我們使用ByteArrayInputStream類從一個字節(jié)數(shù)組中讀取數(shù)據(jù),然后將每個字節(jié)轉(zhuǎn)化為字符輸出。最后需要記得關(guān)閉輸入流。
優(yōu)缺點分析
InputStream類的優(yōu)點在于它是一個抽象類,提供了讀取不同類型數(shù)據(jù)的方法,可以從不同輸入源讀取數(shù)據(jù)。此外,InputStream類提供了mark()、reset()等方法,使得輸入流可以重復(fù)讀取數(shù)據(jù)。
然而,InputStream類本身并不能直接使用,需要使用它的子類,如FileInputStream、ByteArrayInputStream等。這些子類需要根據(jù)不同的輸入源進(jìn)行實例化,使代碼更加復(fù)雜。
類代碼方法介紹
在InputStream類中,最常用的方法是read()、read(byte[] b)和read(byte[] b, int off, int len)方法。下面是它們的詳細(xì)介紹:
- read()方法:讀取一個字節(jié)的數(shù)據(jù),并返回該字節(jié)的值。如果已經(jīng)到達(dá)輸入流的末尾,則返回-1。此方法可能會阻塞,直到輸入數(shù)據(jù)可用、檢測到文件結(jié)束或拋出異常為止。
- read(byte[] b)方法:一次讀取多個字節(jié)的數(shù)據(jù),并將讀取的字節(jié)數(shù)據(jù)存儲到指定的字節(jié)數(shù)組中。返回值為實際讀取的字節(jié)數(shù)。如果已經(jīng)到達(dá)輸入流的末尾,則返回-1。
- read(byte[] b, int off, int len)方法:讀取指定長度的字節(jié)數(shù)據(jù),并存儲到指定的字節(jié)數(shù)組中。返回值為實際讀取的字節(jié)數(shù)。如果已經(jīng)到達(dá)輸入流的末尾,則返回-1。
此外,InputStream類還提供了mark(int readlimit)、reset()、available()等方法。其中,mark(int readlimit)方法允許輸入流在某個位置設(shè)置一個標(biāo)記,以便后續(xù)調(diào)用reset()方法時,輸入流可以回到該標(biāo)記處重新讀取數(shù)據(jù)。而reset()方法可以將輸入流指針重新設(shè)置到最近的標(biāo)記處。available()方法可以返回當(dāng)前可用的字節(jié)數(shù)。
測試用例
下面是一個簡單的測試用例,用來測試InputStream類讀取文件數(shù)據(jù)的功能:
package com.example.javase.se.classes; import java.io.FileInputStream; import java.io.InputStream; /** * @Author ms * @Date 2023-11-04 18:17 */ public class InputStreamTest { public static void main(String[] args) throws Exception { InputStream input = new FileInputStream("test.txt"); int data = input.read(); while (data != -1) { System.out.println((char) data); data = input.read(); } input.close(); } }
在上述代碼中,我們首先使用FileInputStream類打開一個文件輸入流,然后使用InputStream類中的read()方法讀取文件數(shù)據(jù),并將每個字節(jié)轉(zhuǎn)化為字符輸出。最終,我們需要記得關(guān)閉輸入流,以釋放資源。
測試結(jié)果
根據(jù)如上測試用例,本地測試結(jié)果如下,僅供參考,你們也可以自行修改測試用例或者添加更多的測試數(shù)據(jù)或測試方法,進(jìn)行熟練學(xué)習(xí)以此加深理解。
測試代碼分析
根據(jù)如上測試用例,在此我給大家進(jìn)行深入詳細(xì)的解讀一下測試代碼,以便于更多的同學(xué)能夠理解并加深印象。
這段代碼演示了如何使用Java的輸入流來讀取一個文件的內(nèi)容并在控制臺輸出。具體步驟如下:
首先創(chuàng)建一個InputStream對象,通過FileInputStream指定要讀取的文件路徑并傳入構(gòu)造函數(shù)中。
調(diào)用InputStream對象的read()方法讀取文件的內(nèi)容。每次調(diào)用read()方法都會讀取一個字節(jié),并返回其對應(yīng)的ASCII碼值。
使用while循環(huán)不斷地讀取文件,當(dāng)讀取到文件末尾時,read()方法會返回-1。
將每個字節(jié)的ASCII碼值轉(zhuǎn)換成對應(yīng)的字符,并在控制臺上輸出。
最后關(guān)閉InputStream對象,釋放資源。
需要注意的是,在使用輸入流讀取文件時,需要處理異常,因此代碼中使用了throws Exception來拋出可能的異常。另外,還應(yīng)該在讀取文件后關(guān)閉輸入流,以免造成資源浪費或文件被占用的情況。
全文小結(jié)
本文以Java中InputStream類為切入點,介紹了Java中的輸入流概念及其應(yīng)用。我們深入解析了InputStream類的源代碼實現(xiàn),并結(jié)合實際應(yīng)用場景進(jìn)行案例說明。同時,我們分析了InputStream類的優(yōu)缺點,以及類方法的具體介紹和測試用例。
InputStream類是Java中所有輸入流的父類,提供了讀取不同類型數(shù)據(jù)的方法。InputStream類的常用子類有FileInputStream、ByteArrayInputStream等。在Java開發(fā)中,InputStream類的應(yīng)用涉及到文件讀寫、網(wǎng)絡(luò)傳輸?shù)榷鄠€方面。
總結(jié)
本文介紹了Java中的輸入流概念及其應(yīng)用,以InputStream類為切入點,深入解析了該類的源代碼實現(xiàn),并結(jié)合實際應(yīng)用場景進(jìn)行案例說明。同時,文章分析了InputStream類的優(yōu)缺點,以及類方法的具體介紹和測試用例。InputStream類是Java中所有輸入流的父類,提供了讀取不同類型數(shù)據(jù)的方法,并且常用的子類有FileInputStream、ByteArrayInputStream等。在Java開發(fā)中,InputStream類的應(yīng)用涉及到文件讀寫、網(wǎng)絡(luò)傳輸?shù)榷鄠€方面。該篇文章對Java開發(fā)的初學(xué)者和愛好者都有一定的參考價值。
以上就是Java利用InputStream類實現(xiàn)文件讀取與處理的詳細(xì)內(nèi)容,更多關(guān)于Java InputStream文件讀取與處理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java數(shù)據(jù)導(dǎo)入功能之讀取Excel文件實例
這篇文章主要介紹了Java數(shù)據(jù)導(dǎo)入功能之讀取Excel文件實例,本文給出了jar包的下載地址以及讀取Excel文件的代碼實例,需要的朋友可以參考下2015-06-06詳細(xì)了解JAVA NIO之Buffer(緩沖區(qū))
這篇文章主要介紹了JAVA NIO之Buffer(緩沖區(qū))的相關(guān)資料,文中講解非常細(xì)致,幫助大家更好的學(xué)習(xí)JAVA NIO,感興趣的朋友可以了解下2020-07-07SpringAOP實現(xiàn)日志收集管理功能(步驟詳解)
這篇文章主要介紹了SpringAOP實現(xiàn)日志收集管理功能,本文分步驟通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03剖析Java中HashMap數(shù)據(jù)結(jié)構(gòu)的源碼及其性能優(yōu)化
這篇文章主要介紹了Java中HashMap數(shù)據(jù)結(jié)構(gòu)的源碼及其性能優(yōu)化,文中以Java 8后HashMap的性能提升來討論了HashMap的一些優(yōu)化點,需要的朋友可以參考下2016-05-05springboot項目不加端口號也可以訪問項目的方法步驟分析
這篇文章主要介紹了springboot項目不加端口號也可以訪問項目的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04Spring?Boot?MQTT?Too?many?publishes?in?progress錯誤的解決方
本文介紹Spring?Boot?MQTT?Too?many?publishes?in?progress錯誤的解決方案,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下2022-07-07SpringBoot數(shù)據(jù)校驗功能的實現(xiàn)
這篇文章主要介紹了SpringBoot數(shù)據(jù)校驗功能的實現(xiàn),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02springboot @ConfigurationProperties和@PropertySource的區(qū)別
這篇文章主要介紹了springboot @ConfigurationProperties和@PropertySource的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06