【问题标题】:Reading image from URL - performance problems?从 URL 读取图像 - 性能问题?
【发布时间】:2012-11-28 12:02:29
【问题描述】:

有人可以检查下面的代码,看看是否有更好的办法。我真正担心的是性能,我有这个吗?如果没有,我可以做些什么来提高代码的可读性?

try {

    URL url = new URL("http://www.pudim.com.br/SiteBuilder/UploadUsers/pudim.com.br/pudim.jpg");
    URLConnection uc = url.openConnection();
    String type = uc.getContentType();
    BufferedImage image = ImageIO.read(url);
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    ImageIO.write(image, "jpg", os);
    byte[] bytes = os.toByteArray();
    InputStream is = new ByteArrayInputStream(bytes);

    // not important :) ...
} catch (AmazonServiceException e) {
    e.printStackTrace();
} catch (AmazonClientException e) {
    e.printStackTrace();
} catch (MalformedURLException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

欢迎任何考虑。

谢谢!

【问题讨论】:

  • 你为什么使用ImageIO来读写图片?为什么不直接使用URLConnections InputStream 来阅读内容?

标签: java image url inputstream outputstream


【解决方案1】:

您会遇到从 URL 读取时会遇到的所有正常性能问题 - 连接性/带宽/可用性差;同样的解决方案也适用 - 创建和使用本地缓存,在后台线程上执行加载/大量 IO(以避免阻塞主 UI 线程)。您还需要将代码包装在独立的参数化函数中......

在此示例中,您实际上并没有对生成的 InputStream 做任何事情-也许考虑总体上它们是否对于获得您想要的东西是必要的-因为,您每次都将整个图像加载到内存中-不是如果您所做的只是将其保存到磁盘,则完全有必要。

【讨论】:

    【解决方案2】:

    如果您只想下载图像,我会使用BufferedInputStream 让它尽可能快地从下面的网络中读取数据。

    您同样可以使用BufferedOutputStream 将其转储到本地文件的FileOutputStream

    无需进行任何图像处理。

    【讨论】:

    • 实际上这些代码的目的是将来自 URL 的图像保存到我的 AWS S3 存储桶中。这就是为什么我有'byte[] bytes = os.toByteArray();',这样我就得到了文件的长度。由于我对 InputSream 和 OutputStreams 了解不多,所以我问过我是否在做一些愚蠢的事情 :)
    • 好的,所以如果您希望首先在内存中有一个包含文件内容的字节数组,只需使用BufferedInputStream 快速读取数据,然后将其写入ByteArrayOutputStream。然后,一旦您获得 ByteArrayOutputStream 数组的大小并确认要将其写入存储,只需使用 BufferedOutputStream 执行 write(bytes) 其中字节是来自 ByteArrayOutputStream. 的数组您不需要使用ImageIO它只会徒劳地做图像处理。
    • 顺便说一句,您知道URLConnection 实际上提供了一个方法getContentLength(),它可以为您提供要接收的内容的大小,对吗?虽然它有点依赖网络服务器,但有时并不总是提供(HTTP 1.1 需要它,但有些实现不正确)
    猜你喜欢
    • 2016-08-06
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 2021-07-15
    • 2021-05-15
    相关资源
    最近更新 更多