gpt4 book ai didi

java - 图像IO奇怪的行为重置输入流

转载 作者:太空宇宙 更新时间:2023-11-04 07:57:33 24 4
gpt4 key购买 nike

我在 ImageIO.read() 方法中看到了奇怪的行为。

我将 InputStream 传递给此方法,当我第二次尝试读取它时,它无法读取并返回 null。

我正在尝试将图像上传到 Amazon S3,并且想要创建该图像的 3 个版本。原件和 2 个缩略图。我的问题是,当我想创建 2 个缩略图时,我需要使用 ImageIO.read() 读取 InputStream。如果我对同一个输入流运行此方法 2,我会在第二次读取时得到 null。

我可以通过仅读取一个并将相同的 BufferedImage 传递给缩放方法来规避此问题。但是,我仍然需要将我的方法传递给其他方法中的 AmazonS3 服务的 InputStream,以上传原始文件。

所以我的问题是,有人知道 ImageIO 第一次读取输入流后会发生什么吗?

下面的代码示例

public String uploadImage(InputStream stream, String filePath, String fileName, String fileExtension) {
try {

String originalKey = filePath + fileName + "." + fileExtension;
String smallThumbKey = filePath + fileName + ImageConst.Path.SMALL_THUMB + "." + fileExtension;
String largetThumbKey = filePath + fileName + ImageConst.Path.LARGE_THUMB + "." + fileExtension;

BufferedImage image = ImageIO.read(stream);
InputStream smallThumb = createSmallThumb(image, fileExtension);
InputStream largeThumb = createLargeThumb(image, fileExtension);

uploadFileToS3(originalKey, stream);
uploadFileToS3(smallThumbKey, smallThumb);
uploadFileToS3(largetThumbKey, largeThumb);

return originalKey;

} catch (IOException ex) {
Logger.getLogger(ManageUser.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}

最佳答案

ImageIO.read 将读取到输入流的末尾。这意味着没有剩余数据可供读取,这就是为什么当您尝试从中读取更多数据时会得到 null 的原因。

如果你想重用输入流,你必须对其调用reset();但这只有在底层 InputStream 实现支持重置时才有效,请参阅 InputStream 的 markSupported() 。

这是一个简单但幼稚的修复方法。

请记住,您已经将图像读入内存,因此您实际上不需要这样做。这有点笨拙,但您可以将其写入 ByteArrayOutputStream,然后从中构建一个新的 ByteArrayInputStream。

如果我这样做,我可能会首先将其读入字节数组。查看 Commons IOUtils.read() 来了解这一点。然后我会根据需要构建一个新的 ByteArrayInputStream 和 reset(),因为它肯定支持标记。

关于java - 图像IO奇怪的行为重置输入流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13388354/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com