Java IOUtils.read()之后InputStream会发生什么情况

Java IOUtils.read()之后InputStream会发生什么情况,java,inputstream,apache-commons-io,Java,Inputstream,Apache Commons Io,我正在编写一个代码来验证最大文件大小 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

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

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保存为image,当我将相同的InputStream引用传递给s3 bucket的save method upload method时,损坏的图像将被保存。有谁能告诉我发生了什么事吗?

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

您可以用不同的方式获得文件的大小

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

如果文件不太大,则可以继续保存文件。要检查文件大小,请检查@tkausl提供的文件大小。一旦您从输入流中读取了某个内容,它就会“消失”。读取位置沿输入向上移动。因此,当您忙于计算文件中的字节数时,您同时会丢失数据,因为它没有被存储。因此,一旦传递InputStream引用以保存文件,读取器就不再位于流/文件的开头,从而导致文件损坏

您可以用不同的方式获得文件的大小

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

如果文件不太大,则可以继续保存文件。要检查文件大小,请同时检查@tkausl

提供的值,读取位置会增加。@tkausl:那么使用IOUtils.read()检查文件大小是否正确?否。如果仍要读取内容,为什么要先通读以查找大小?只需加载数据并检查加载的大小。@tkausl:我不想将其转换为java.io.file来检查大小。我必须传递InputStream以将图像文件上载到s3 bucket。(更新了我的问题)。读取位置会增加。@tkausl:那么,使用IOUtils.read()检查文件大小是否正确?否。如果仍要读取内容,为什么要先通读以查找大小?只需加载数据并检查加载的大小。@tkausl:我不想将其转换为java.io.file来检查大小。我必须传递InputStream以将图像文件上载到s3 bucket。(更新了我的问题)。谢谢@ophychius提供的信息。实际上,我正在从Jersey REST获取一个作为InputStream的图像,我必须将该InputStream传递到s3 bucket。我认为将其转换为java.io.file只是为了检查大小会有点奇怪。@user1120946您发布的代码已经使用了
java.io.file
。如果这不是真正的代码,那么你的问题是徒劳的,如果你的目的是加载两次文件,同上。谢谢@ophychius提供的信息。实际上,我正在从Jersey REST获取一个作为InputStream的图像,我必须将该InputStream传递到s3 bucket。我认为将其转换为java.io.file只是为了检查大小会有点奇怪。@user1120946您发布的代码已经使用了
java.io.file
。如果这不是真正的代码,那么您的问题是徒劳的,如果您的目的是加载文件两次,同上。