Java解决InputStream流重复使用问题【100%解决】

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: Java解决InputStream流重复使用问题【100%解决】

背景

我在做上传文件的时候,第一步要读取文件中的数据进行分析校验,第二步,校验通过后需求将源文件上传OSS,然后使用同一个InputStream流,发现上传OSS的文件为0kb了。

本博客同事解决上传OSS文件为0kb等问题


你在网上找的 将InputStream 转化成ByteArrayInputStream 然后再次调用使用,我可以负责任告诉你,没用,已经测试过。以下例句没用的代码

/**
 * 转换为字节数组输入流,可以重复消费流中数据
 *
 * @param inputStream
 * @return
 * @throws IOException
 */
public static ByteArrayInputStream toByteArrayInputStream(InputStream inputStream) throws IOException {
    if (inputStream instanceof ByteArrayInputStream) {
        return (ByteArrayInputStream) inputStream;
    }
 
    try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
        BufferedInputStream br = new BufferedInputStream(inputStream);
        byte[] b = new byte[1024];
        for (int c; (c = br.read(b)) != -1; ) {
            bos.write(b, 0, c);
        }
        // 主动告知回收
        b = null;
        br.close();
        inputStream.close();
        return new ByteArrayInputStream(bos.toByteArray());
    }
}

真正解决方案:

private static  byte[] cloneInputStream(InputStream input) {
    try {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len;
        while ((len = input.read(buffer)) > -1) {
            baos.write(buffer, 0, len);
        }
        baos.flush();
        baos.close()
        input.close()
        return baos.toByteArray();
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}
 

调用:

 //存入上传文件到OSS
  byte[] bytes = cloneInputStream(inputStream); 
  InputStream fileInputStream = new ByteArrayInputStream(bytes);
  AliyunCloudStorageService storageService = new AliyunCloudStorageService(config);
  storageService.upload(fileInputStream, fileName, url);
 
 //读取文件 
  InputStream newInputStream = new ByteArrayInputStream(bytes);
        CsvReader csvReader = new CsvReader(new BufferedInputStream(newInputStream), Charset.forName("utf-8"));
相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
6月前
|
缓存 Java
java把InputStream流写入到文件中
java把InputStream流写入到文件中
122 0
|
2天前
|
XML Java 数据格式
|
2天前
|
存储 JavaScript 前端开发
java9新特性之-String存储结构变更--集合工厂方法-- InputStream 加强--增强的 Stream API讲解
java9新特性之-String存储结构变更--集合工厂方法-- InputStream 加强--增强的 Stream API讲解
43 0
|
9月前
|
缓存 网络协议 Java
深入理解 Java 中的 InputStream:输入流的奥秘解析
在 Java 编程中,输入流(InputStream)是一个重要的概念,它为我们提供了一种从数据源读取数据的方式。无论是读取文件、网络数据还是其他数据源,InputStream 都是不可或缺的工具。本文将带您深入探索 Java 中的 InputStream,解析其原理、用法以及在实际开发中的应用
|
11月前
|
存储 缓存 Java
【Java I/O 流】字节输入输出流:InputStream & OutputStream
本篇介绍字节输入输出流,它们是所有字节流的超类,提供了一些常用方法,我们一起看一下。
45 0
|
XML Java 数据格式
Java,InputStream,Socket阻塞.(关于HTTP请求的IO问题自我总结)
Java,InputStream,Socket阻塞.(关于HTTP请求的IO问题自我总结)
279 0
|
Java 程序员
JAVA:文本文件读写使用Reader/Writer,二进制文件使用InputStream/OutputStream
JAVA:文本文件读写使用Reader/Writer,二进制文件使用InputStream/OutputStream
67 0
|
缓存 Java
Java学习路线-26:字节流与字符流OutputStream/InputStream/Writer/Reader
Java学习路线-26:字节流与字符流OutputStream/InputStream/Writer/Reader
114 0