【问题标题】:What happens to InputStream after IOUtils.read()IOUtils.read() 之后 InputStream 会发生什么
【发布时间】:2016-08-28 05:31:06
【问题描述】:

我正在编写代码来验证最大文件大小。

public static void main(String[] args) throws IOException {

    final InputStream inputStream = new FileInputStream(new File("/path/to/image.jpg"));

    System.out.println("initial: " + inputStream.read());

    int arr = IOUtils.read(inputStream, new byte[2000001]);
    if (arr == 2000001) {
        System.out.println("file size greater than limit");
    }
    System.out.println("after: " + inputStream.read());
}

输出

initial: 255
file size greater than limit
after: 21

问题是当 InputStream 被传递给 IOUtils.read() 时会发生什么?展望未来,我必须将 InputStream 保存为图像,当我将相同的 InputStream 引用传递给 s3 存储桶的 save 方法 上传方法时,损坏的图像会被保存。谁能告诉我这是怎么回事?

【问题讨论】:

  • 读取位置增加。
  • @tkausl:那么使用 IOUtils.read() 检查文件大小是否正确?
  • 如果您仍然要阅读内容,为什么要先通读以找到大小?只需加载数据并检查加载的大小。
  • @tkausl:我不想将其转换为 java.io.file 以检查大小。我必须通过 InputStream 将图像文件上传到 s3 存储桶。 (更新了我的问题)。

标签: java inputstream apache-commons-io


【解决方案1】:

一旦您从 InputStream 中读取内容,它就“消失”了。读取位置沿输入向上移动。因此,当您忙于尝试计算文件中的字节数时,您同时会丢失数据,因为它没有被存储。因此,一旦您通过 InputStream 引用来保存文件,您的阅读器就不再位于流/文件的开头,从而导致文件损坏。

您可以通过不同的方式获取文件的大小。

java.io.File file = new java.io.File("example.file");
file.length();

如果文件不是太大,您可以继续保存文件。要检查文件大小,还请检查@tkausl 提供的link

【讨论】:

  • 感谢@ophychius 提供的信息。实际上,我从 Jersey REST 获取图像作为 InputStream,我必须将该 InputStream 传递到上传到 s3 存储桶。我认为将其转换为 java.io.file 只是为了检查大小会有点奇怪。
  • @user1120946 您发布的代码已经使用了java.io.File。如果那不是真正的代码,那么您的问题是徒劳的,如果您的意图是两次加载文件,同上。
猜你喜欢
  • 2023-03-26
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
  • 2020-04-29
  • 1970-01-01
  • 2020-07-14
相关资源
最近更新 更多