Java?InputStream實(shí)戰(zhàn)之輕松讀取操作文件流
前言
Java是一門(mén)非常流行的編程語(yǔ)言,廣泛應(yīng)用于各種應(yīng)用程序的開(kāi)發(fā)。在Java中,輸入輸出是非常重要的基礎(chǔ)功能。其中,InputStream是Java中的一個(gè)重要輸入流類(lèi),用于從輸入源讀取數(shù)據(jù)。
摘要
本文將介紹InputStream類(lèi)的源代碼解析、應(yīng)用場(chǎng)景案例、優(yōu)缺點(diǎn)分析、類(lèi)代碼方法介紹以及測(cè)試用例。
InputStream類(lèi)
簡(jiǎn)介
InputStream是Java中的一個(gè)抽象類(lèi),用于從輸入源讀取數(shù)據(jù)。它提供了以下基本方法:
int read()
:從輸入流中讀取一個(gè)字節(jié)的數(shù)據(jù)。如果已經(jīng)到達(dá)輸入流的末尾,則返回-1。int read(byte[] b)
:從輸入流中讀取一定數(shù)量的字節(jié),并將其存儲(chǔ)在緩沖區(qū)數(shù)組b中。返回實(shí)際讀取的字節(jié)數(shù)。int read(byte[] b, int off, int len)
:從輸入流中讀取最多l(xiāng)en個(gè)字節(jié),并將其存儲(chǔ)在緩沖區(qū)數(shù)組b中,從偏移量off開(kāi)始存儲(chǔ)。返回實(shí)際讀取的字節(jié)數(shù)。long skip(long n)
:從輸入流中跳過(guò)并丟棄n個(gè)字節(jié)的數(shù)據(jù),并返回實(shí)際跳過(guò)的字節(jié)數(shù)。int available()
:返回可從輸入流中讀取的估計(jì)字節(jié)數(shù)。void close()
:關(guān)閉輸入流并釋放與之相關(guān)的任何系統(tǒng)資源。
InputStream類(lèi)是一個(gè)抽象類(lèi),不能直接實(shí)例化。它有幾個(gè)具體的子類(lèi),如FileInputStream、ByteArrayInputStream、PipedInputStream等。這些子類(lèi)提供了實(shí)際的方法來(lái)從特定類(lèi)型的輸入源中讀取數(shù)據(jù)。
源代碼解析
InputStream類(lèi)的源代碼可以在JDK中找到。以下是該類(lèi)的部分源代碼:
public abstract class InputStream implements Closeable { // ... public abstract int read() throws IOException; public int read(byte[] b) throws IOException { return read(b, 0, b.length); } public int read(byte[] b, int off, int len) throws IOException { if (b == null) { throw new NullPointerException(); } else if (off < 0 || len < 0 || len > b.length - off) { throw new IndexOutOfBoundsException(); } else if (len == 0) { return 0; } int c = read(); if (c == -1) { return -1; } b[off] = (byte) c; int i = 1; try { for (; i < len ; i++) { c = read(); if (c == -1) { break; } b[off + i] = (byte) c; } } catch (IOException ee) { } return i; } // ... }
從上述代碼中可以看出,InputStream類(lèi)定義了一個(gè)抽象方法read(),用于從輸入流中讀取一個(gè)字節(jié)的數(shù)據(jù)。它還定義了重載的read()方法,用于從輸入流中讀取一定數(shù)量的字節(jié),并將其存儲(chǔ)在緩沖區(qū)數(shù)組中。
在read(byte[] b, int off, int len)方法中,該方法首先檢查參數(shù)是否合法。然后,它從輸入流中讀取第一個(gè)字節(jié),并將其存儲(chǔ)在緩沖區(qū)數(shù)組的偏移量off位置。接下來(lái),該方法從輸入流中讀取len-1個(gè)字節(jié),并將它們存儲(chǔ)在緩沖區(qū)數(shù)組中。最后,該方法返回實(shí)際讀取的字節(jié)數(shù)。
應(yīng)用場(chǎng)景案例
InputStream類(lèi)的應(yīng)用場(chǎng)景非常廣泛。以下是一些典型的應(yīng)用場(chǎng)景:
- 從文件中讀取數(shù)據(jù)。可以使用FileInputStream類(lèi)來(lái)創(chuàng)建一個(gè)輸入流,然后從該流中讀取數(shù)據(jù)。
- 從網(wǎng)絡(luò)中讀取數(shù)據(jù)。可以使用Socket類(lèi)來(lái)創(chuàng)建一個(gè)連接,然后從該連接的輸入流中讀取數(shù)據(jù)。
- 從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)??梢允褂肑DBC API來(lái)執(zhí)行查詢(xún)操作,并從查詢(xún)結(jié)果集的輸入流中讀取數(shù)據(jù)。
- 從字節(jié)數(shù)組中讀取數(shù)據(jù)??梢允褂肂yteArrayInputStream類(lèi)來(lái)創(chuàng)建一個(gè)輸入流,然后從該流中讀取數(shù)據(jù)。
- 從管道中讀取數(shù)據(jù)??梢允褂肞ipedInputStream類(lèi)來(lái)創(chuàng)建一個(gè)輸入流,然后從該流中讀取數(shù)據(jù)。
優(yōu)缺點(diǎn)分析
InputStream類(lèi)的主要優(yōu)點(diǎn)是它提供了一套抽象的、統(tǒng)一的輸入流API,使得從不同類(lèi)型的輸入源中讀取數(shù)據(jù)變得非常容易。
該類(lèi)的主要缺點(diǎn)是它是一個(gè)抽象類(lèi),不能直接實(shí)例化。而且,它的具體子類(lèi)需要提供實(shí)際的方法來(lái)從特定類(lèi)型的輸入源中讀取數(shù)據(jù)。這使得InputStream類(lèi)的使用略微有些復(fù)雜。
此外,如果從輸入源讀取的數(shù)據(jù)量很大,InputStream類(lèi)可能會(huì)導(dǎo)致內(nèi)存占用和性能問(wèn)題。
類(lèi)代碼方法介紹
InputStream類(lèi)定義了許多方法,以下是其中一些方法的介紹:
int read()
:從輸入流中讀取一個(gè)字節(jié)的數(shù)據(jù)。如果已經(jīng)到達(dá)輸入流的末尾,則返回-1。int read(byte[] b)
:從輸入流中讀取一定數(shù)量的字節(jié),并將其存儲(chǔ)在緩沖區(qū)數(shù)組b中。返回實(shí)際讀取的字節(jié)數(shù)。int read(byte[] b, int off, int len)
:從輸入流中讀取最多l(xiāng)en個(gè)字節(jié),并將其存儲(chǔ)在緩沖區(qū)數(shù)組b中,從偏移量off開(kāi)始存儲(chǔ)。返回實(shí)際讀取的字節(jié)數(shù)。long skip(long n)
:從輸入流中跳過(guò)并丟棄n個(gè)字節(jié)的數(shù)據(jù),并返回實(shí)際跳過(guò)的字節(jié)數(shù)。int available()
:返回可從輸入流中讀取的估計(jì)字節(jié)數(shù)。void close()
:關(guān)閉輸入流并釋放與之相關(guān)的任何系統(tǒng)資源。
測(cè)試用例
以下是一個(gè)簡(jiǎn)單的測(cè)試用例,用于從文件中讀取數(shù)據(jù):
package com.example.javase.io.fileProject; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; /** * @Author 喵手 * @Date 2023-10-18 22:32 */ public class InputStreamTest { public static void testInputStream_1() throws IOException { InputStream in = new FileInputStream("testDoc.txt"); byte[] buffer = new byte[1024]; int length = in.read(buffer); while (length != -1) { System.out.write(buffer, 0, length); length = in.read(buffer); } in.close(); } public static void main(String[] args) throws IOException { testInputStream_1(); } }
以上代碼將打開(kāi)一個(gè)名為testDoc.txt的文件,從中讀取數(shù)據(jù),并將其輸出到控制臺(tái)。
如下是上述案例執(zhí)行結(jié)果:
小結(jié)
InputStream是Java中的一個(gè)重要輸入流類(lèi),用于從輸入源讀取數(shù)據(jù)。它提供了一套抽象的、統(tǒng)一的輸入流API,使得從不同類(lèi)型的輸入源中讀取數(shù)據(jù)變得非常容易。
本文介紹了InputStream類(lèi)的源代碼解析、應(yīng)用場(chǎng)景案例、優(yōu)缺點(diǎn)分析、類(lèi)代碼方法介紹以及測(cè)試用例。希望讀者可以通過(guò)本文深入了解InputStream類(lèi)的相關(guān)知識(shí),并在實(shí)際開(kāi)發(fā)中熟練應(yīng)用。
總結(jié)
本文對(duì)Java中的InputStream類(lèi)進(jìn)行了詳細(xì)介紹。InputStream類(lèi)是Java中的一個(gè)抽象類(lèi),用于從輸入源讀取數(shù)據(jù)。它提供了一套抽象的、統(tǒng)一的輸入流API,使得從不同類(lèi)型的輸入源中讀取數(shù)據(jù)變得非常容易。該類(lèi)的具體子類(lèi)需要提供實(shí)際的方法來(lái)從特定類(lèi)型的輸入源中讀取數(shù)據(jù)。
在本文中,我們首先對(duì)InputStream類(lèi)的源代碼進(jìn)行了解析,重點(diǎn)介紹了read()和read(byte[] b, int off, int len)方法的實(shí)現(xiàn)。接著我們介紹了InputStream的應(yīng)用場(chǎng)景,包括從文件、網(wǎng)絡(luò)、數(shù)據(jù)庫(kù)、字節(jié)數(shù)組和管道中讀取數(shù)據(jù)等。我們還分析了該類(lèi)的優(yōu)缺點(diǎn),指出它的主要優(yōu)點(diǎn)是提供了統(tǒng)一的輸入流API,而缺點(diǎn)在于使用略微有些復(fù)雜,且可能導(dǎo)致內(nèi)存占用和性能問(wèn)題。
到此這篇關(guān)于Java InputStream實(shí)戰(zhàn)之輕松讀取操作文件流的文章就介紹到這了,更多相關(guān)Java InputStream內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java?CompletableFuture實(shí)現(xiàn)多線(xiàn)程異步編排
這篇文章主要為大家介紹了Java?CompletableFuture實(shí)現(xiàn)多線(xiàn)程異步編排,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Spring Security OAuth 個(gè)性化token的使用
這篇文章主要介紹了Spring Security OAuth 個(gè)性化token的使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02淺談在springboot中使用定時(shí)任務(wù)的方式
今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著在springboot中使用定時(shí)任務(wù)的方式展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06詳解Java中的反射機(jī)制和動(dòng)態(tài)代理
本文將詳細(xì)介紹反射機(jī)制以及動(dòng)態(tài)代理機(jī)制,而且基本現(xiàn)在的主流框架都應(yīng)用了反射機(jī)制,如spring、MyBatis、Hibernate等等,這就有非常重要的學(xué)習(xí)意義2021-06-06