Java?InputStream實戰(zhàn)之輕松讀取操作文件流
前言
Java是一門非常流行的編程語言,廣泛應(yīng)用于各種應(yīng)用程序的開發(fā)。在Java中,輸入輸出是非常重要的基礎(chǔ)功能。其中,InputStream是Java中的一個重要輸入流類,用于從輸入源讀取數(shù)據(jù)。
摘要
本文將介紹InputStream類的源代碼解析、應(yīng)用場景案例、優(yōu)缺點分析、類代碼方法介紹以及測試用例。
InputStream類
簡介
InputStream是Java中的一個抽象類,用于從輸入源讀取數(shù)據(jù)。它提供了以下基本方法:
int read()
:從輸入流中讀取一個字節(jié)的數(shù)據(jù)。如果已經(jīng)到達輸入流的末尾,則返回-1。int read(byte[] b)
:從輸入流中讀取一定數(shù)量的字節(jié),并將其存儲在緩沖區(qū)數(shù)組b中。返回實際讀取的字節(jié)數(shù)。int read(byte[] b, int off, int len)
:從輸入流中讀取最多l(xiāng)en個字節(jié),并將其存儲在緩沖區(qū)數(shù)組b中,從偏移量off開始存儲。返回實際讀取的字節(jié)數(shù)。long skip(long n)
:從輸入流中跳過并丟棄n個字節(jié)的數(shù)據(jù),并返回實際跳過的字節(jié)數(shù)。int available()
:返回可從輸入流中讀取的估計字節(jié)數(shù)。void close()
:關(guān)閉輸入流并釋放與之相關(guān)的任何系統(tǒng)資源。
InputStream類是一個抽象類,不能直接實例化。它有幾個具體的子類,如FileInputStream、ByteArrayInputStream、PipedInputStream等。這些子類提供了實際的方法來從特定類型的輸入源中讀取數(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類定義了一個抽象方法read(),用于從輸入流中讀取一個字節(jié)的數(shù)據(jù)。它還定義了重載的read()方法,用于從輸入流中讀取一定數(shù)量的字節(jié),并將其存儲在緩沖區(qū)數(shù)組中。
在read(byte[] b, int off, int len)方法中,該方法首先檢查參數(shù)是否合法。然后,它從輸入流中讀取第一個字節(jié),并將其存儲在緩沖區(qū)數(shù)組的偏移量off位置。接下來,該方法從輸入流中讀取len-1個字節(jié),并將它們存儲在緩沖區(qū)數(shù)組中。最后,該方法返回實際讀取的字節(jié)數(shù)。
應(yīng)用場景案例
InputStream類的應(yīng)用場景非常廣泛。以下是一些典型的應(yīng)用場景:
- 從文件中讀取數(shù)據(jù)。可以使用FileInputStream類來創(chuàng)建一個輸入流,然后從該流中讀取數(shù)據(jù)。
- 從網(wǎng)絡(luò)中讀取數(shù)據(jù)。可以使用Socket類來創(chuàng)建一個連接,然后從該連接的輸入流中讀取數(shù)據(jù)。
- 從數(shù)據(jù)庫中讀取數(shù)據(jù)??梢允褂肑DBC API來執(zhí)行查詢操作,并從查詢結(jié)果集的輸入流中讀取數(shù)據(jù)。
- 從字節(jié)數(shù)組中讀取數(shù)據(jù)??梢允褂肂yteArrayInputStream類來創(chuàng)建一個輸入流,然后從該流中讀取數(shù)據(jù)。
- 從管道中讀取數(shù)據(jù)??梢允褂肞ipedInputStream類來創(chuàng)建一個輸入流,然后從該流中讀取數(shù)據(jù)。
優(yōu)缺點分析
InputStream類的主要優(yōu)點是它提供了一套抽象的、統(tǒng)一的輸入流API,使得從不同類型的輸入源中讀取數(shù)據(jù)變得非常容易。
該類的主要缺點是它是一個抽象類,不能直接實例化。而且,它的具體子類需要提供實際的方法來從特定類型的輸入源中讀取數(shù)據(jù)。這使得InputStream類的使用略微有些復(fù)雜。
此外,如果從輸入源讀取的數(shù)據(jù)量很大,InputStream類可能會導(dǎo)致內(nèi)存占用和性能問題。
類代碼方法介紹
InputStream類定義了許多方法,以下是其中一些方法的介紹:
int read()
:從輸入流中讀取一個字節(jié)的數(shù)據(jù)。如果已經(jīng)到達輸入流的末尾,則返回-1。int read(byte[] b)
:從輸入流中讀取一定數(shù)量的字節(jié),并將其存儲在緩沖區(qū)數(shù)組b中。返回實際讀取的字節(jié)數(shù)。int read(byte[] b, int off, int len)
:從輸入流中讀取最多l(xiāng)en個字節(jié),并將其存儲在緩沖區(qū)數(shù)組b中,從偏移量off開始存儲。返回實際讀取的字節(jié)數(shù)。long skip(long n)
:從輸入流中跳過并丟棄n個字節(jié)的數(shù)據(jù),并返回實際跳過的字節(jié)數(shù)。int available()
:返回可從輸入流中讀取的估計字節(jié)數(shù)。void close()
:關(guān)閉輸入流并釋放與之相關(guān)的任何系統(tǒng)資源。
測試用例
以下是一個簡單的測試用例,用于從文件中讀取數(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(); } }
以上代碼將打開一個名為testDoc.txt的文件,從中讀取數(shù)據(jù),并將其輸出到控制臺。
如下是上述案例執(zhí)行結(jié)果:
小結(jié)
InputStream是Java中的一個重要輸入流類,用于從輸入源讀取數(shù)據(jù)。它提供了一套抽象的、統(tǒng)一的輸入流API,使得從不同類型的輸入源中讀取數(shù)據(jù)變得非常容易。
本文介紹了InputStream類的源代碼解析、應(yīng)用場景案例、優(yōu)缺點分析、類代碼方法介紹以及測試用例。希望讀者可以通過本文深入了解InputStream類的相關(guān)知識,并在實際開發(fā)中熟練應(yīng)用。
總結(jié)
本文對Java中的InputStream類進行了詳細介紹。InputStream類是Java中的一個抽象類,用于從輸入源讀取數(shù)據(jù)。它提供了一套抽象的、統(tǒng)一的輸入流API,使得從不同類型的輸入源中讀取數(shù)據(jù)變得非常容易。該類的具體子類需要提供實際的方法來從特定類型的輸入源中讀取數(shù)據(jù)。
在本文中,我們首先對InputStream類的源代碼進行了解析,重點介紹了read()和read(byte[] b, int off, int len)方法的實現(xiàn)。接著我們介紹了InputStream的應(yīng)用場景,包括從文件、網(wǎng)絡(luò)、數(shù)據(jù)庫、字節(jié)數(shù)組和管道中讀取數(shù)據(jù)等。我們還分析了該類的優(yōu)缺點,指出它的主要優(yōu)點是提供了統(tǒng)一的輸入流API,而缺點在于使用略微有些復(fù)雜,且可能導(dǎo)致內(nèi)存占用和性能問題。
到此這篇關(guān)于Java InputStream實戰(zhàn)之輕松讀取操作文件流的文章就介紹到這了,更多相關(guān)Java InputStream內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java?CompletableFuture實現(xiàn)多線程異步編排
這篇文章主要為大家介紹了Java?CompletableFuture實現(xiàn)多線程異步編排,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09Spring Security OAuth 個性化token的使用
這篇文章主要介紹了Spring Security OAuth 個性化token的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02