Java?InputStream實(shí)戰(zhàn)之輕松讀取操作文件流
前言
Java是一門非常流行的編程語言,廣泛應(yīng)用于各種應(yīng)用程序的開發(fā)。在Java中,輸入輸出是非常重要的基礎(chǔ)功能。其中,InputStream是Java中的一個(gè)重要輸入流類,用于從輸入源讀取數(shù)據(jù)。
摘要
本文將介紹InputStream類的源代碼解析、應(yīng)用場景案例、優(yōu)缺點(diǎn)分析、類代碼方法介紹以及測試用例。
InputStream類
簡介
InputStream是Java中的一個(gè)抽象類,用于從輸入源讀取數(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開始存儲(chǔ)。返回實(shí)際讀取的字節(jié)數(shù)。long skip(long n):從輸入流中跳過并丟棄n個(gè)字節(jié)的數(shù)據(jù),并返回實(shí)際跳過的字節(jié)數(shù)。int available():返回可從輸入流中讀取的估計(jì)字節(jié)數(shù)。void close():關(guān)閉輸入流并釋放與之相關(guān)的任何系統(tǒng)資源。
InputStream類是一個(gè)抽象類,不能直接實(shí)例化。它有幾個(gè)具體的子類,如FileInputStream、ByteArrayInputStream、PipedInputStream等。這些子類提供了實(shí)際的方法來從特定類型的輸入源中讀取數(shù)據(jù)。
源代碼解析
InputStream類的源代碼可以在JDK中找到。以下是該類的部分源代碼:
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類定義了一個(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位置。接下來,該方法從輸入流中讀取len-1個(gè)字節(jié),并將它們存儲(chǔ)在緩沖區(qū)數(shù)組中。最后,該方法返回實(shí)際讀取的字節(jié)數(shù)。
應(yīng)用場景案例
InputStream類的應(yīng)用場景非常廣泛。以下是一些典型的應(yīng)用場景:
- 從文件中讀取數(shù)據(jù)。可以使用FileInputStream類來創(chuàng)建一個(gè)輸入流,然后從該流中讀取數(shù)據(jù)。
- 從網(wǎng)絡(luò)中讀取數(shù)據(jù)。可以使用Socket類來創(chuàng)建一個(gè)連接,然后從該連接的輸入流中讀取數(shù)據(jù)。
- 從數(shù)據(jù)庫中讀取數(shù)據(jù)。可以使用JDBC API來執(zhí)行查詢操作,并從查詢結(jié)果集的輸入流中讀取數(shù)據(jù)。
- 從字節(jié)數(shù)組中讀取數(shù)據(jù)??梢允褂肂yteArrayInputStream類來創(chuàng)建一個(gè)輸入流,然后從該流中讀取數(shù)據(jù)。
- 從管道中讀取數(shù)據(jù)??梢允褂肞ipedInputStream類來創(chuàng)建一個(gè)輸入流,然后從該流中讀取數(shù)據(jù)。
優(yōu)缺點(diǎn)分析
InputStream類的主要優(yōu)點(diǎn)是它提供了一套抽象的、統(tǒng)一的輸入流API,使得從不同類型的輸入源中讀取數(shù)據(jù)變得非常容易。
該類的主要缺點(diǎn)是它是一個(gè)抽象類,不能直接實(shí)例化。而且,它的具體子類需要提供實(shí)際的方法來從特定類型的輸入源中讀取數(shù)據(jù)。這使得InputStream類的使用略微有些復(fù)雜。
此外,如果從輸入源讀取的數(shù)據(jù)量很大,InputStream類可能會(huì)導(dǎo)致內(nèi)存占用和性能問題。
類代碼方法介紹
InputStream類定義了許多方法,以下是其中一些方法的介紹:
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開始存儲(chǔ)。返回實(shí)際讀取的字節(jié)數(shù)。long skip(long n):從輸入流中跳過并丟棄n個(gè)字節(jié)的數(shù)據(jù),并返回實(shí)際跳過的字節(jié)數(shù)。int available():返回可從輸入流中讀取的估計(jì)字節(jié)數(shù)。void close():關(guān)閉輸入流并釋放與之相關(guān)的任何系統(tǒng)資源。
測試用例
以下是一個(gè)簡單的測試用例,用于從文件中讀取數(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();
}
}
以上代碼將打開一個(gè)名為testDoc.txt的文件,從中讀取數(shù)據(jù),并將其輸出到控制臺(tái)。
如下是上述案例執(zhí)行結(jié)果:

小結(jié)
InputStream是Java中的一個(gè)重要輸入流類,用于從輸入源讀取數(shù)據(jù)。它提供了一套抽象的、統(tǒng)一的輸入流API,使得從不同類型的輸入源中讀取數(shù)據(jù)變得非常容易。
本文介紹了InputStream類的源代碼解析、應(yīng)用場景案例、優(yōu)缺點(diǎn)分析、類代碼方法介紹以及測試用例。希望讀者可以通過本文深入了解InputStream類的相關(guān)知識(shí),并在實(shí)際開發(fā)中熟練應(yīng)用。
總結(jié)
本文對Java中的InputStream類進(jìn)行了詳細(xì)介紹。InputStream類是Java中的一個(gè)抽象類,用于從輸入源讀取數(shù)據(jù)。它提供了一套抽象的、統(tǒng)一的輸入流API,使得從不同類型的輸入源中讀取數(shù)據(jù)變得非常容易。該類的具體子類需要提供實(shí)際的方法來從特定類型的輸入源中讀取數(shù)據(jù)。
在本文中,我們首先對InputStream類的源代碼進(jìn)行了解析,重點(diǎn)介紹了read()和read(byte[] b, int off, int len)方法的實(shí)現(xiàn)。接著我們介紹了InputStream的應(yīng)用場景,包括從文件、網(wǎng)絡(luò)、數(shù)據(jù)庫、字節(jié)數(shù)組和管道中讀取數(shù)據(jù)等。我們還分析了該類的優(yōu)缺點(diǎn),指出它的主要優(yōu)點(diǎn)是提供了統(tǒng)一的輸入流API,而缺點(diǎn)在于使用略微有些復(fù)雜,且可能導(dǎo)致內(nèi)存占用和性能問題。
到此這篇關(guān)于Java InputStream實(shí)戰(zhàn)之輕松讀取操作文件流的文章就介紹到這了,更多相關(guān)Java InputStream內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java?CompletableFuture實(shí)現(xiàn)多線程異步編排
這篇文章主要為大家介紹了Java?CompletableFuture實(shí)現(xiàn)多線程異步編排,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
Spring Security OAuth 個(gè)性化token的使用
這篇文章主要介紹了Spring Security OAuth 個(gè)性化token的使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-02-02
淺談在springboot中使用定時(shí)任務(wù)的方式
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識(shí),文章圍繞著在springboot中使用定時(shí)任務(wù)的方式展開,文中有非常詳細(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

