最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中InputStream重復(fù)使用問(wèn)題的幾種解決方案

 更新時(shí)間:2025年08月09日 14:06:42   作者:ecexy78041  
在Java開(kāi)發(fā)中,InputStream是用于讀取字節(jié)流的類,在許多場(chǎng)景下,我們可能需要重復(fù)讀取InputStream中的數(shù)據(jù),這篇文章主要介紹了Java中InputStream重復(fù)使用問(wèn)題的幾種解決方案,需要的朋友可以參考下

前言

在Java中,InputStream通常設(shè)計(jì)為"一次性"使用,讀取后流會(huì)到達(dá)末尾,再次讀取時(shí)會(huì)返回-1或拋出異常。以下是幾種實(shí)現(xiàn)InputStream重復(fù)使用的方法:

1. 使用mark()和reset()方法(適用于支持標(biāo)記的流)

java

import java.io.*;

public class InputStreamReuser {
    public static void main(String[] args) throws IOException {
        String data = "Hello World";
        InputStream inputStream = new ByteArrayInputStream(data.getBytes());
        
        // 第一次讀取前標(biāo)記
        if (inputStream.markSupported()) {
            inputStream.mark(0); // 參數(shù)是readlimit,0表示不限制
        }
        
        // 第一次讀取
        System.out.println("第一次讀取:");
        readAndPrint(inputStream);
        
        // 重置流
        if (inputStream.markSupported()) {
            inputStream.reset();
        }
        
        // 第二次讀取
        System.out.println("第二次讀取:");
        readAndPrint(inputStream);
    }
    
    private static void readAndPrint(InputStream is) throws IOException {
        int content;
        while ((content = is.read()) != -1) {
            System.out.print((char) content);
        }
        System.out.println();
    }
}

2. 將流內(nèi)容緩存到字節(jié)數(shù)組(最可靠方法)

java

import java.io.*;

public class InputStreamCacher {
    public static void main(String[] args) throws IOException {
        InputStream originalStream = new FileInputStream("example.txt");
        
        // 將流內(nèi)容緩存到字節(jié)數(shù)組
        byte[] bytes = readAllBytes(originalStream);
        originalStream.close();
        
        // 創(chuàng)建可重復(fù)使用的流
        InputStream reusableStream1 = new ByteArrayInputStream(bytes);
        InputStream reusableStream2 = new ByteArrayInputStream(bytes);
        
        // 使用流1
        System.out.println("第一次使用:");
        readAndPrint(reusableStream1);
        
        // 使用流2
        System.out.println("第二次使用:");
        readAndPrint(reusableStream2);
    }
    
    private static byte[] readAllBytes(InputStream is) throws IOException {
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        byte[] data = new byte[1024];
        int nRead;
        while ((nRead = is.read(data, 0, data.length)) != -1) {
            buffer.write(data, 0, nRead);
        }
        return buffer.toByteArray();
    }
    
    private static void readAndPrint(InputStream is) throws IOException {
        int content;
        while ((content = is.read()) != -1) {
            System.out.print((char) content);
        }
        System.out.println();
    }
}

3. 使用Apache Commons IO的IOUtils(簡(jiǎn)化代碼)

java

import org.apache.commons.io.IOUtils;
import java.io.*;

public class CommonsIOExample {
    public static void main(String[] args) throws IOException {
        InputStream originalStream = new FileInputStream("example.txt");
        
        // 將流轉(zhuǎn)換為字節(jié)數(shù)組
        byte[] bytes = IOUtils.toByteArray(originalStream);
        originalStream.close();
        
        // 創(chuàng)建可重復(fù)使用的流
        InputStream reusableStream1 = new ByteArrayInputStream(bytes);
        InputStream reusableStream2 = new ByteArrayInputStream(bytes);
        
        // 使用流
        System.out.println("第一次使用: " + IOUtils.toString(reusableStream1, "UTF-8"));
        System.out.println("第二次使用: " + IOUtils.toString(reusableStream2, "UTF-8"));
    }
}

4. 自定義可重置的InputStream包裝器

java

import java.io.*;

public class ResettableInputStream extends InputStream {
    private final InputStream original;
    private InputStream current;
    private byte[] buffer;
    private boolean buffered = false;
    
    public ResettableInputStream(InputStream original) {
        this.original = original;
        this.current = original;
    }
    
    @Override
    public int read() throws IOException {
        return current.read();
    }
    
    public void resetStream() throws IOException {
        if (!buffered) {
            // 第一次重置時(shí)緩存內(nèi)容
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] data = new byte[1024];
            int nRead;
            while ((nRead = original.read(data, 0, data.length)) != -1) {
                baos.write(data, 0, nRead);
            }
            buffer = baos.toByteArray();
            buffered = true;
        }
        current = new ByteArrayInputStream(buffer);
    }
    
    @Override
    public void close() throws IOException {
        original.close();
        if (buffered && current != null) {
            current.close();
        }
    }
}

// 使用示例
public class Main {
    public static void main(String[] args) throws IOException {
        ResettableInputStream ris = new ResettableInputStream(new FileInputStream("example.txt"));
        
        // 第一次讀取
        System.out.println("第一次讀取:");
        readAndPrint(ris);
        
        // 重置
        ris.resetStream();
        
        // 第二次讀取
        System.out.println("第二次讀取:");
        readAndPrint(ris);
        
        ris.close();
    }
    
    private static void readAndPrint(InputStream is) throws IOException {
        int content;
        while ((content = is.read()) != -1) {
            System.out.print((char) content);
        }
        System.out.println();
    }
}

注意事項(xiàng)

  • 內(nèi)存考慮:緩存整個(gè)流到內(nèi)存中可能不適合處理非常大的文件

  • 資源釋放:確保在所有使用完成后關(guān)閉流

  • 性能影響:重復(fù)讀取相同的流內(nèi)容會(huì)有額外的內(nèi)存開(kāi)銷

  • 網(wǎng)絡(luò)流:對(duì)于網(wǎng)絡(luò)流,通常無(wú)法重置,必須先緩存內(nèi)容

  • 標(biāo)記支持:不是所有InputStream實(shí)現(xiàn)都支持mark()reset()

總結(jié)

到此這篇關(guān)于Java中InputStream重復(fù)使用問(wèn)題的幾種解決方案的文章就介紹到這了,更多相關(guān)Java中InputStream重復(fù)使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java繼承關(guān)系中構(gòu)造器的使用詳解

    Java繼承關(guān)系中構(gòu)造器的使用詳解

    本文介紹了繼承關(guān)系中構(gòu)造器的使用要點(diǎn),創(chuàng)建子類對(duì)象時(shí),必須先調(diào)用父類構(gòu)造器實(shí)現(xiàn)初始化,若父類無(wú)參構(gòu)造器被覆蓋,子類需用super顯式調(diào)用父類構(gòu)造器,且super須寫在構(gòu)造器首行,感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • spring aop底層原理及如何實(shí)現(xiàn)

    spring aop底層原理及如何實(shí)現(xiàn)

    這篇文章主要介紹了spring aop底層原理及如何實(shí)現(xiàn),幫助大家更好的理解和學(xué)習(xí)使用spring aop,感興趣的朋友可以了解下
    2021-04-04
  • JDK(免安裝)各種版本下載及配置詳細(xì)圖文教程

    JDK(免安裝)各種版本下載及配置詳細(xì)圖文教程

    這篇文章主要給大家介紹了關(guān)于JDK(免安裝)各種版本下載及配置的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-07-07
  • 使用SpringBoot找不到Mapper的Bean問(wèn)題及解決

    使用SpringBoot找不到Mapper的Bean問(wèn)題及解決

    這篇文章主要介紹了使用SpringBoot找不到Mapper的Bean問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2026-04-04
  • eclipse創(chuàng)建java項(xiàng)目并運(yùn)行的詳細(xì)教程講解

    eclipse創(chuàng)建java項(xiàng)目并運(yùn)行的詳細(xì)教程講解

    eclipse是java開(kāi)發(fā)的ide工具,是大部分java開(kāi)發(fā)人員的首選開(kāi)發(fā)工具,可是對(duì)于一些新Java人員來(lái)說(shuō),不清楚eclipse怎么運(yùn)行項(xiàng)目?這篇文章主要給大家介紹了關(guān)于eclipse創(chuàng)建java項(xiàng)目并運(yùn)行的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • java中Consumer接口的使用教程詳解

    java中Consumer接口的使用教程詳解

    Java?8?引入了?java.util.function?包,其中包含了一些常用的函數(shù)式接口,Consumer?接口是其中一個(gè)函數(shù)式接口,用于表示接受一個(gè)輸入?yún)?shù)并執(zhí)行某種操作的操作者,下面我們就來(lái)學(xué)習(xí)一下他的具體使用吧
    2023-12-12
  • Spring Boot 快速集成 Redis的方法

    Spring Boot 快速集成 Redis的方法

    這篇文章主要介紹了Spring Boot 如何快速集成 Redis,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java 14 發(fā)布了,你還會(huì)使用Lombok?

    Java 14 發(fā)布了,你還會(huì)使用Lombok?

    2020年3月17日發(fā)布,Java正式發(fā)布了JDK 14 ,目前已經(jīng)可以開(kāi)放下載。在JDK 14中,共有16個(gè)新特性,本文主要來(lái)介紹其中的一個(gè)特性:JEP 359: Records,需要的朋友可以參考下
    2020-04-04
  • mybatis參數(shù)類型不匹配錯(cuò)誤argument type mismatch的處理方案

    mybatis參數(shù)類型不匹配錯(cuò)誤argument type mismatch的處理方案

    這篇文章主要介紹了mybatis參數(shù)類型不匹配錯(cuò)誤argument type mismatch的處理方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • mybatis-plus分頁(yè)無(wú)效問(wèn)題解決

    mybatis-plus分頁(yè)無(wú)效問(wèn)題解決

    本文主要介紹了mybatis-plus分頁(yè)無(wú)效問(wèn)題解決,原因是配置分頁(yè)插件的版本問(wèn)題,舊版本和新版本的MyBatis-Plus需要不同的分頁(yè)配置,感興趣的可以了解一下
    2025-03-03

最新評(píng)論

宣城市| 崇州市| 桐梓县| 忻城县| 色达县| 黔西| 平陆县| 昌图县| 青冈县| 女性| 当雄县| 昂仁县| 措美县| 芜湖县| 修水县| 新疆| 芷江| 色达县| 新乡县| 桃园县| 兴城市| 新邵县| 格尔木市| 宁津县| 长海县| 郴州市| 阿拉尔市| 阳谷县| 县级市| 来凤县| 保定市| 鸡东县| 汝州市| 原阳县| 高邮市| 平邑县| 玉山县| 商水县| 林甸县| 凤城市| 定结县|