InputStream为什么不能被重复读取?

2023-11-10

最近上传阿里云的时候同一个文件上传两个服务地址,第一个文件读取以后第二个再去读取就拿不到了。代码如下:

   //内网上传OSS获取key值
        String ossKey = OSSClientUtil.getOSSURL(endpoint, accessKeyId, accessKeySecret, bucketName, key, inputStream);
        //外网上传OSS获取key值
        String outOssLink = OSSClientUtil.getOutOSSLink(outEndpoint, outAccessKeyId, outAccessKeySecret, outBucketName, key,
                inputStream); 

导致第二次上传失败。

Java中的Inputstream是不能重复读取的。
但是有没有想过,InputStream为什么不能重复读呢?
其实要回答“为什么”这个问题很简单,就是人家接口就是这么设计的,不能重复读。
所以今天要讨论的问题更像是:Java的InputStream为什么要设计为不能重复读?
关于InputStream为什么不能重复读取,网上也各有说法:
有的同学说:
“InputStream就类比成一个杯子,杯子里的水就像InputStream里的数据,你把杯子里的水拿出来了,杯子的水就没有了,InputStream也是同样的道理。”
比喻的非常好,让我们从直观上认识了InputStream为什么不能重复被读。
也有的同学从更深的代码角度去分析:
“在InputStream读取的时候,会有一个pos指针,他指示每次读取之后下一次要读取的起始位置,当读到最后一个字符的时候,pos指针不会重置。”
说的也有道理,就是说InputStream的读取是单向的。但是并不是所有的InputStream实现类都是这样的实现方式。

Java 的List内部是使用数组实现的,遍历的时候也有一个pos指针。但是没有说List遍历一个第二次遍历就没有了。第二次遍历是创建新的Iterator,所以pos也回到了数组起始位置。对于某些InputStream当然可以也这么做。例如:ByteArrayInputStream
ByteArrayInputStream就是将一个Java的byte数组保存到对象里,然后读取的时候遍历该byte数组。

更改以后的代码如下:

public class InputStreamFactory {

    private ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    private byte[]                buffer                = new byte[1024];

    public InputStreamFactory(InputStream input) throws IOException {
        int len;
        while ((len = input.read(buffer)) > -1) {
            byteArrayOutputStream.write(buffer, 0, len);
        }
        byteArrayOutputStream.flush();
    }

    public InputStream newInputStream() {
        return new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
    }

}

更改代码:

  InputStreamFactory inputStreamFactory = null;
        try {
            inputStreamFactory = new InputStreamFactory(inputStream);
            //内网上传OSS获取key值
            String ossKey = OSSClientUtil.getOSSURL(endpoint, accessKeyId, accessKeySecret, bucketName, key,
                    inputStreamFactory.newInputStream());
            //外网上传OSS获取key值
            String outOssLink = OSSClientUtil.getOutOSSLink(outEndpoint, outAccessKeyId, outAccessKeySecret, outBucketName,
                    key, inputStreamFactory.newInputStream());
        } catch (IOException e) {
            log.info("读取文件流失败", e);
        }

  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

InputStream为什么不能被重复读取? 的相关文章

  • 为什么 Hashtable 不允许空键或空值?

    正如 JDK 文档中所指定的 Hashtable 不允许空键或空值 HashMap 允许一个空键和任意数量的空值 为什么是这样 Hashtable 是较旧的类 通常不鼓励使用它 也许他们看到了对 null 键的需要 更重要的是 null 值
  • Java - 将无符号十六进制字符串解析为有符号长整型

    我有一堆十六进制字符串 其中之一是 d1bc4f7154ac9edb 这是 3333702275990511909 的十六进制值 如果执行 Long toHexString d1bc4f7154ac9edb 这与您得到的十六进制相同 现在
  • 将 WAR 部署到 Tomcat(Spring Boot + Angular)

    我正在尝试使用以下命令部署 Spring Boot 应用程序WAR包装至Tomcat 10 应用程序已成功部署 但是 当我尝试访问端点时 它会导致404 未找到 战争文件 应用程序 war http localhost 8080 appli
  • java中高效的输入流到字符串方法

    因此 我在 Java 中的 诚然非常简单 应用程序上运行探查器 令我惊讶的是 仅次于需要在时间上发出 HTTP 请求的方法的是我的方法 inputStreamToString方法 目前它的定义如下 public static String
  • 递归取消 allOf CompletableFuture

    如果我有 CompletableFuture
  • 如何检查单词是否在wordNet中

    我开始了解wordNet直到我知道我找到了synonymous对于一个特定的词 现在我有一个文件 我想使用标记化该文本n gram例如 String s I like to wear tee shirt 使用后n gram这将是 I lik
  • 在 Eclipse 中删除空块之前的新行

    我更喜欢奥尔曼式 http en wikipedia org wiki Brace style Allman style大括号 例如 if foo magical prancing unicorn stuff 而不是 if foo unma
  • JFrame 在连续运行代码时冻结

    我在使用时遇到问题JFrame 它会冻结 连续运行代码 下面是我的代码 点击时btnRun 我调用了该函数MainLoop ActionListener btnRun Click new ActionListener Override pu
  • java.exe 以非零退出值 1 结束

    只是为了开始 我并不是真正尝试从 Android 中的 xlsx 文件中读取单元格 我已经尝试了几乎所有我在 Google 上搜索到的内容 但是每次 在两台不同的 PC 上 都是 Java 1 7 0 79 当我尝试构建 运行 这个应用程序
  • java绕中心旋转矩形

    我想围绕其中心点旋转一个矩形 它应该保留在应该绘制的位置并在该空间中旋转 这是我的代码 AffineTransform transform new AffineTransform transform rotate Math toRadian
  • javadoc 子集/java 库组织

    我自己从来没有运行过javadoc 无论是在命令行还是ant 的 javadoc 任务 http ant apache org manual Tasks javadoc html 我将使用 ant 我需要为我编写的库生成 javadoc 问
  • 在 Kotlin 中声明静态属性?

    My Java code public class Common public static ModelPengguna currentModelPengguna public class Common companion object v
  • 添加 char 和 int

    据我了解 字符是一个字符 即一个字母 一个digit 标点符号 制表符 空格或类似的东西 因此 当我这样做时 char c 1 System out println c 输出 1 正是我所期望的 那么为什么当我这样做时 int a 1 ch
  • 如何使用 AffineTransform.quadrantRotate 旋转位图?

    我想旋转一个bitmap关于它的中心点 然后将其绘制成更大的图形上下文 位图是40x40 pixels 图形上下文是500x500 pixels 这就是我正在做的 BufferedImage bi new BufferedImage 500
  • 线程数组?

    所以我在理解如何避免线程的顺序执行时遇到了问题 我试图创建一个线程数组并在单独的循环中执行 start 和 join 函数 这是我现在拥有的代码示例 private static int w static class wThreads im
  • 在 Spring MVC 中将请求写入文件

    我希望能够将整个请求写入 Spring MVC 控制器中的文件 我已尝试以下操作 但即使我使用大量参数发出 POST 请求 文件也始终为空 RequestMapping method RequestMethod POST value pay
  • 使用 Hibernate Envers 的复合表

    我有一个带有复合表的应用程序 其中包含一个额外的列 一切正常 直到我们添加 Hibernate Envers Audited org hibernate MappingException 无法读取 no pack response Resp
  • Axis2 的 wsdl2java 在 RPC/Encoded 样式 Web 服务上失败

    Axis2 有替代方案吗 或者让它工作的方式 例如不同的数据绑定 Retrieving document at Exception in thread main org apache axis2 wsdl codegen CodeGener
  • FragmentMap + ActionBar 选项卡

    我一直在尝试插入一个MapView进入一个ActionBar Tab 但我什至无法解决问题 即使谷歌搜索 这是主要活动 Override public void onCreate Bundle savedInstanceState supe
  • MyBatis 枚举的使用

    我知道以前有人问过这个问题 但我无法根据迄今为止找到的信息实施解决方案 所以也许有人可以向我解释一下 我有一个表 状态 它有两列 id 和 name id是PK 我不想使用 POJO Status 而是使用枚举 我创建了这样一个枚举 如下所

随机推荐

  • scrapy-redis分布式爬虫框架详解

    scrapy redis分布式爬虫框架详解 随着互联网技术的发展与应用的普及 网络作为信息的载体 已经成为社会大众参与社会生活的一种重要信息渠道 由于互联网是开放的 每个人都可以在网络上发表信息 内容涉及各个方面 小到心情日志 大到国家大事
  • sqllab 1-6 练习

    前言 什么是sql注入 攻击者通过构造不同的sql语句来实现对数据库的操作 两个关键 参数用户可控 参数带入数据库查询 基本流程 判断注入点 判断字段数 判断回显点 查询相关内容 判断库名 gt 判断表明 gt 判断列名 gt 判断数据 搭
  • xxl-job详细使用指南

    新建任务说明 本篇文章承接上文 xxl job快速入门指南 上一次和大家简单介绍了下 xxl job 的由来以及使用方法 本篇文章将会详细介绍一些高级使用方法及特性 上文中我们在新建一个任务的时候发现有很多的选项 现在我们来详细聊一聊他们的
  • Jquery加载本地文件出现跨域错误的解决方案

    禁止跨域是浏览器的安全限制机制 会报告上述错误 但是可以通过设置来绕过这个限制 如果经常调试前端代码 可以在本机装个web容器 常见的方式 右击chrome快捷方式 选择 属性 在 快捷方式 下的 目标 中添加 allow file acc
  • HT for Web (Hightopo) 使用心得(6)- 3D场景环境配置(天空球,雾化,辉光,景深)

    在前一篇文章 Hightopo 使用心得 5 动画的实现 中 我们将一个直升机模型放到了3D场景中 同时 还利用动画实现了让该直升机围绕山体巡逻 在这篇文章中 我们将对上一篇的场景进行一些环境上的丰富与美化 让场景更真实一些 具体涉及到的知
  • 微信小程序基础入门的知识点

    微信小程序基础入门的知识点 1 窗口配置 就是在我们app json文件就是对我们微信小程序进行全局配置 它决定我们页面文件的路径 设置多个tab 1 1 pages设置页面的路径 数组的第一个就是我们小程序初始页面 文件名不需要我们写文件
  • C语言入门之自定义结构体数据struct Student { int num; char name[20]; char sex; int age; 类型

    用户自己建立由不同类型数据组成的组合型的数据结构 它称为结构体 例如 一个学生的学号 姓名 性别 年龄 成绩 家庭地址等项 是属于同一个学生的 因此组成一个组合数据 如student 1的变量 反映它们之间的内在联系 struct Stud
  • 字节跳动,华为,阿里巴巴,小米,腾讯 2021大厂面试经历系列之初、中、高级测试工程师面试题汇总(附答案)

    前言 最近看到很多人都在找工作 而且很多人都感觉今年找工作比去年难很多 竞争力也增加不少 因此激发我整理这份资料 希望能帮到正在找或者准备找工作的童鞋们 首先我们能否获得一个面试机会 那肯定是从简历开始 简历需要做好功夫 一份好的简历才足够
  • Springboot集成Jasypt实现配置文件加密

    不容错过的成长之旅 Jasypt介绍 Jasypt是一个java库 它允许开发员以最少的努力为他 她的项目添加基本的加密功能 并且不需要对加密工作原理有深入的了解 用于单向和双向加密的高安全性 基于标准的加密技术 加密密码 文本 数字 二进
  • 解决Windows10中文用户名带来软件无法打开的影响

    众所周知 许多国外的开发软件都不支持中文的文件路径名 即使软件的路径无中文字符 可你系统用户的名称是中文 同样软件无法运行 因为大部分软件的在电脑用户上的缓冲文件都是在 C user 你的用户名称 AppData local temp 解决
  • Power BI和Tableau对比分析,到底要学哪个?

    Power BI和Tableau对比分析 到底要学哪个 一 两个工具优缺点 Power BI Tableau 二 职业需求 前程无忧 智联招聘 三 总结 学习tableau还是power bi想必是很多初学者的疑惑 可以从以下两个角度去考虑
  • 一台服务器想用150个ip,可以吗?

    不可以 一台服务器一次只支持一个ip 可以更换 但每次绑定一个 如果需要多个ip 只能多开服务器 挂店铺的 包括淘宝店铺 拼多多店铺 亚马逊店铺都想店铺不被关联 想买台服务器 可以的 一个店铺买一台服务器 有几个店铺就买几台服务器 ip的带
  • 数据结构:(代码篇:004)二叉搜索树 BST(二叉查找树)的基本操作

    1 基本概念 二叉搜索树 是二叉树是真子集 要求 根节点大于或等于左子树的节点值 小于右子树的节点值 他的中序遍历是有序的 基本操作有 查找 插入 删除 建树 查找和插入以及建树都很简单 和二叉树的差不多 删除略微复杂 2 存储结构 str
  • Apche Kafka + Spring的消息监听容器

    目录 一 消息的接收 1 1 消息监听器 二 消息监听容器 2 1 实现方法 2 1 1 KafkaMessageListenerContainer 2 1 1 1 基本概念 2 1 1 2 如何使用 KafkaMessageListene
  • SpringMVC异常处理

    1 概述 SpringMVC 框架处理异常的常用方式 使用 ExceptionHandler 注解处理异常 2 ExceptionHandler注解和用 ControllerAdvice注解 2 1 ExceptionHandler注解 使
  • VIVADO软件错误及解决办法汇总

    在VIVADO软件编写程序时会遇到很多类型的错误 写个博客记录下来防止再犯 短期可能只有几个问题 会长期保持更新 遇到问题就记录 2022 4 09 问题1 The debug port u ila 0 probe4 has 1 uncon
  • 盘点C# 8.0中好用的特性

    增加引用类型可为null 如果参数t是null 则会发出警告 public static void Test
  • CocosCreator3.8研究笔记(十八)CocosCreator UI组件(二)

    前面的文章已经介绍了Canvas 组件 UITransform 组件 Widget 组件 想了解的朋友 请查看 CocosCreator3 8研究笔记 十七 CocosCreator UI组件 一 今天我们主要介绍CocosCreator
  • OPENCV基础(图像,视频)

    文章目录 1 图像读取 展示 写入 2 视频读取 展示 写入 1 图像读取 展示 写入 使用cv imread 函数读取图像 使用函数cv imshow 在窗口中显示图像 使用函数cv imwrite 保存图像 import numpy a
  • InputStream为什么不能被重复读取?

    最近上传阿里云的时候同一个文件上传两个服务地址 第一个文件读取以后第二个再去读取就拿不到了 代码如下 内网上传OSS获取key值 String ossKey OSSClientUtil getOSSURL endpoint accessKe