Java中InputStream流的多次读取的实现示例

 更新时间:2026年01月26日 09:11:12   作者:一线大码  
本文主要介绍了Java中InputStream流的多次读取的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在读取 InputStream 的时候,其实内部是有个指针,它指示每次读取之后下一次要读取的起始位置,当第一次读完的时候,指针已经指到最后了,当再次读取的时候,自然是读不到数据的。

1. 使用 StringBuilder 中转

    public static void main(String[] args) throws IOException {
        String filePath = "C:\\Users\\wangb\\Desktop\\test.txt";
        // 使用Files.newInputStream方法获取InputStream
        InputStream is = Files.newInputStream(Paths.get(filePath));

        // builder 保留读到的数据
        StringBuilder builder = new StringBuilder();
        byte[] buffer = new byte[1024];
        int len;
        while ((len = is.read(buffer)) != -1) {
            builder.append(new String(buffer, 0, len));
        }

        System.out.println("-------第一次需要InputStream,那么就创建一个-------");
        InputStream isOne = new ByteArrayInputStream(builder.toString().getBytes());
        // 下面是测试新的InputStream到底是否有数据
        byte[] bufferOne = new byte[1024];
        int lenOne;
        while ((lenOne = isOne.read(bufferOne)) != -1) {
            System.out.println(new String(bufferOne, 0, lenOne));
        }

        System.out.println("-------第二次需要InputStream,那么就再创建一个-------");
        InputStream isTwo = new ByteArrayInputStream(builder.toString().getBytes());
        // 下面是测试新的InputStream到底是否有数据
        byte[] bufferTwo = new byte[1024];
        int lenTwo;
        while ((lenTwo = isTwo.read(bufferTwo)) != -1) {
            System.out.println(new String(bufferTwo, 0, lenTwo));
        }
        is.close();
        isOne.close();
        isTwo.close();
    }

2. 使用 ByteArrayOutputStream 中转

    public static void main(String[] args) throws IOException {
        String filePath = "C:\\Users\\wangb\\Desktop\\test.txt";
        // 使用Files.newInputStream方法获取InputStream
        InputStream is = Files.newInputStream(Paths.get(filePath));

        ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
        int len;
        byte[] buffer = new byte[1024];
        while ((len = is.read(buffer)) != -1) {
            byteArrayOut.write(buffer, 0, len);
        }

        System.out.println("-------第一次需要InputStream,那么就创建一个-------");
        InputStream isOne = new ByteArrayInputStream(byteArrayOut.toByteArray());
        // 下面是测试新的InputStream到底是否有数据
        byte[] bufferOne = new byte[1024];
        int lenOne;
        while ((lenOne = isOne.read(bufferOne)) != -1) {
            System.out.println(new String(bufferOne, 0, lenOne));
        }

        System.out.println("-------第二次需要InputStream,那么就再创建一个-------");
        InputStream isTwo = new ByteArrayInputStream(byteArrayOut.toByteArray());
        // 下面是测试新的InputStream到底是否有数据
        byte[] bufferTwo = new byte[1024];
        int lenTwo;
        while ((lenTwo = isTwo.read(bufferTwo)) != -1) {
            System.out.println(new String(bufferTwo, 0, lenTwo));
        }
        is.close();
        isOne.close();
        isTwo.close();
    }

3. 使用 ByteArrayInputStream 重置指针

    public static void main(String[] args) throws IOException {
        String filePath = "C:\\Users\\wangb\\Desktop\\test.txt";
        // 使用Files.newInputStream方法获取InputStream
        InputStream is = Files.newInputStream(Paths.get(filePath));

        ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
        int len;
        byte[] buffer = new byte[1024];
        while ((len = is.read(buffer)) != -1) {
            byteArrayOut.write(buffer, 0, len);
        }

        // 创建一个新的 ByteArrayInputStream 对象,包含复制的数据
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOut.toByteArray());

        System.out.println("-------第一次使用-------");
        // 下面是测试新的InputStream到底是否有数据
        byte[] bufferOne = new byte[1024];
        int lenOne;
        while ((lenOne = byteArrayInputStream.read(bufferOne)) != -1) {
            System.out.println(new String(bufferOne, 0, lenOne));
        }

        // 重置 ByteArrayInputStream 的指针到开头
        byteArrayInputStream.reset();

        System.out.println("-------第二次使用-------");
        // 下面是测试新的InputStream到底是否有数据
        byte[] bufferTwo = new byte[1024];
        int lenTwo;
        while ((lenTwo = byteArrayInputStream.read(bufferTwo)) != -1) {
            System.out.println(new String(bufferTwo, 0, lenTwo));
        }
        is.close();
        byteArrayInputStream.close();
    }

到此这篇关于Java中InputStream流的多次读取的实现示例的文章就介绍到这了,更多相关Java InputStream流读取内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Prometheus监控Springboot程序的实现方法

    Prometheus监控Springboot程序的实现方法

    这篇文章主要介绍了Prometheus监控Springboot程序的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Java Spring快速入门

    Java Spring快速入门

    本文主要介绍了SpringSpring简介和入门知识。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • Java后端之俯瞰数据接收的三种方式

    Java后端之俯瞰数据接收的三种方式

    在前后端分离的开发项目中,前后端联调的时候会出现这样那样的问题,尤其是在调取数据的程序上面,有时候前端给的前端给到后端的明明是正确的但就是无法拿到正确的数据,下面小千就来给大家详解一下常见的三种数据传输方式
    2021-10-10
  • SpringBoot实现整合微信支付方法详解

    SpringBoot实现整合微信支付方法详解

    这篇文章主要介绍了SpringBoot实现整合微信支付的过程详解,文中的示例代码对我们的工作或学习有一定的帮助,感兴趣的小伙伴可以跟随小编学习一下
    2021-12-12
  • WebSocket无法注入属性的问题及解决方案

    WebSocket无法注入属性的问题及解决方案

    这篇文章主要介绍了WebSocket无法注入属性的问题及解决方法,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • Java抓包工具fiddler实现请求转发

    Java抓包工具fiddler实现请求转发

    Fiddler是一个http协议调试代理工具,本文主要介绍了Java抓包工具fiddler实现请求转发,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • 一文详解Java中三大异常处理方式(try-catch、throw、throws)

    一文详解Java中三大异常处理方式(try-catch、throw、throws)

    这篇文章主要介绍了Java中三大异常处理方式的相关资料,分别是try-catch、throw、throws,try-catch、throw、throws,try-catch用于捕获和处理异常,throw用于显式抛出异常,throws用于声明方法可能抛出的异常,需要的朋友可以参考下
    2026-01-01
  • SpringBoot底层注解超详细介绍

    SpringBoot底层注解超详细介绍

    这篇文章主要介绍了SpringBoot底层注解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-09-09
  • BiConsumer接口中的方法andThen accept使用详解

    BiConsumer接口中的方法andThen accept使用详解

    这篇文章主要为大家介绍了BiConsumer接口中的方法andThen accept使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Java中Semaphore信号量的方法解析

    Java中Semaphore信号量的方法解析

    这篇文章主要介绍了Java中Semaphore信号量的方法解析,  Semaphore信号量是用来控制同 时访问 特定 资 源的 线 程数量,它通 过协调 各个 线 程,以保证合理的使用公共 资源,需要的朋友可以参考下
    2023-12-12

最新评论