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流读取内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring引入外部属性文件配置数据库连接的步骤详解

    Spring引入外部属性文件配置数据库连接的步骤详解

    这篇文章主要介绍了Spring引入外部属性文件配置数据库连接的步骤详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • springboot实现增加黑名单和白名单功能

    springboot实现增加黑名单和白名单功能

    本文主要介绍了springboot实现增加黑名单和白名单功能,就是单纯的实现filter,然后注册到springboot里面,在filter里面进行黑白名单的筛选,感兴趣的可以了解一下
    2024-05-05
  • java加密MD5实现及密码验证代码实例

    java加密MD5实现及密码验证代码实例

    这篇文章主要介绍了java加密MD5实现及密码验证代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • JAVA字符串格式化-String.format()的使用

    JAVA字符串格式化-String.format()的使用

    本篇文章主要介绍了JAVA字符串格式化-String.format()的使用,具有一定的参考价值,有需要的可以了解一下。
    2016-11-11
  • Springboot通过请求头获取当前用户信息方法详细示范

    Springboot通过请求头获取当前用户信息方法详细示范

    这篇文章主要介绍了Springboot通过请求头获取当前用户信息的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-11-11
  • 浅析如何在SpringBoot上传中将MultipartFile转File对象

    浅析如何在SpringBoot上传中将MultipartFile转File对象

    在我们开发 Spring Boot Web 应用中,文件上传通常通过 MultipartFile 接口接收,但有时我们需要将 MultipartFile 转成标准的 java.io.File 对象,下面我们就来看看具体实现吧
    2025-08-08
  • 解决SpringBoot使用devtools导致的类型转换异常问题

    解决SpringBoot使用devtools导致的类型转换异常问题

    这篇文章主要介绍了解决SpringBoot使用devtools导致的类型转换异常问题,具有很好的参考价值,希望对大家有所帮助。 一起跟随小编过来看看吧
    2020-08-08
  • JPA实现多条件分页查询

    JPA实现多条件分页查询

    这篇文章主要介绍了JPA实现多条件分页查询方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 解读@RequestBody的正确使用方法

    解读@RequestBody的正确使用方法

    这篇文章主要介绍了解读@RequestBody的正确使用方法,具有一定借鉴价值
    2018-01-01
  • SpringMVC视图作用详解

    SpringMVC视图作用详解

    这篇文章主要介绍了springMVC中的视图与视图解析器,springMVC视图的种类很多,默认有转发视图和重定向视图,本文就每一种视图给大家详细介绍,需要的朋友可以参考下
    2022-11-11

最新评论