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,搭建一个在线教育视频课程分享网站。
相关文章
|
1月前
|
算法 Java Linux
java制作海报四:java BufferedImage 转 InputStream 上传至OSS。png 图片合成到模板(另一个图片)上时,透明部分变成了黑色
这篇文章主要介绍了如何将Java中的BufferedImage对象转换为InputStream以上传至OSS,并解决了png图片合成时透明部分变黑的问题。
60 1
|
5月前
|
Java 数据处理 开发者
Java IO流专家级教程:深入理解InputStream/OutputStream和Reader/Writer的内部机制
【6月更文挑战第26天】Java IO流涉及字节流(InputStream/OutputStream)和字符流(Reader/Writer),用于高效处理数据输入输出。InputStream/OutputStream处理二进制数据,常使用缓冲提升性能;Reader/Writer处理文本,关注字符编码转换。两者都有阻塞IO操作,但Java NIO支持非阻塞。示例代码展示了如何使用FileInputStream/FileOutputStream和FileReader/FileWriter读写文件。理解这些流的内部机制有助于优化代码性能。
120 0
|
5月前
|
Java 开发者
Java IO流实战技巧:如何优化InputStream/OutputStream和Reader/Writer的使用?
【6月更文挑战第26天】Java IO流优化涉及缓冲、资源管理、字符编码和流式处理。使用Buffered流提高读写效率,如`BufferedInputStream`和`BufferedReader`。确保资源关闭使用try-with-resources,如`try (InputStream is = ...) {...}`。处理文本时指定编码,如`InputStreamReader(is, StandardCharsets.UTF_8)`防止乱码。流式处理大文件,分块读写避免内存溢出,以减少内存占用。这些技巧能提升程序性能和健壮性。
236 0
|
5月前
|
Java
Java IO流终极指南:从InputStream/OutputStream到Reader/Writer的全面解读
【6月更文挑战第26天】Java IO流涵盖字节流(InputStream/OutputStream)和字符流(Reader/Writer),前者处理二进制数据,后者专司文本。例如,FileInputStream/FileOutputStream用于文件的字节级读写,而FileReader/FileWriter处理字符级文本。Buffered流提供缓冲功能,提升效率。选择合适的流类取决于数据类型和性能需求。
98 0
|
5月前
|
存储 设计模式 Java
Java IO流大揭秘:如何高效使用InputStream/OutputStream和Reader/Writer?
【6月更文挑战第26天】Java IO流核心基础,涉及InputStream/OutputStream(字节流)和Reader/Writer(字符流)。高效使用的关键包括:使用Buffered流提升性能,如BufferedInputStream和BufferedOutputStream;处理编码,通过InputStreamReader和OutputStreamWriter指定如UTF-8编码;应用装饰器模式,如DataOutputStream增强功能。理解并巧妙运用这些技巧能优化数据读写操作。
105 0
|
5月前
|
Java
深入探索Java IO流:InputStream/OutputStream与Reader/Writer的奥秘!
【6月更文挑战第26天】Java IO流用于输入输出操作,包括字节流(InputStream/OutputStream)和字符流(Reader/Writer)。InputStream和OutputStream处理字节数据,是所有字节流的基类,可被继承以自定义读写行为。
87 0
|
5月前
|
Java API
Java中使用InputStream读入Jar/zip内容
Java中使用InputStream读入Jar/zip内容
71 0
|
缓存 Java
java把InputStream流写入到文件中
java把InputStream流写入到文件中
262 0
|
6月前
|
XML Java 数据格式
|
6月前
|
存储 JavaScript 前端开发
java9新特性之-String存储结构变更--集合工厂方法-- InputStream 加强--增强的 Stream API讲解
java9新特性之-String存储结构变更--集合工厂方法-- InputStream 加强--增强的 Stream API讲解
76 0