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