Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从URL读取图像-性能问题?_Java_Image_Url_Inputstream_Outputstream - Fatal编程技术网

Java 从URL读取图像-性能问题?

Java 从URL读取图像-性能问题?,java,image,url,inputstream,outputstream,Java,Image,Url,Inputstream,Outputstream,有人可以检查一下下面的代码,看看是否有更好的办法。我真正担心的是性能问题,我会有什么建议吗?如果没有,我是否可以做些更好的事情来提高代码的可读性 try { URL url = new URL("http://www.pudim.com.br/SiteBuilder/UploadUsers/pudim.com.br/pudim.jpg"); URLConnection uc = url.openConnection(); String type = uc.getCont

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

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();
}
欢迎任何考虑


谢谢

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


在这个例子中,你实际上并没有对你的结果<代码>输入流< /代码>做任何事情——也许考虑一下它们是否有必要获得你想要的东西。您每次都将整个图像加载到内存中—如果您所做的只是将其保存到磁盘中,那么这不是完全必要的。

如果您只想下载图像,我将使用 使其能够从下面的网络中尽可能快地读取数据

类似地,您可以使用将其转储到本地文件的
FileOutputStream


无需进行任何图像处理。

为什么要使用
ImageIO
读取和写入图像?为什么不使用
URLConnection
s
InputStream
读取内容呢?实际上,这些代码的目的是将来自URL的图像保存到我的AWS S3存储桶中。这就是为什么我有'byte[]bytes=os.toByteArray();',通过这个,我得到了文件的长度。由于我对InputsReal和OutputStreams了解不多,为了检查我是否做了一些愚蠢的事情,我问了一下:)好的,如果您希望首先在内存中有一个包含文件内容的字节数组,只需使用
BufferedInputStream
快速读取数据,然后像现在这样通过TearrayOutstream将其写入
。然后,一旦您获得
ByteArrayOutputStream的数组大小,并确认要将其写入存储器,只需使用
BufferedOutputStream
进行
写入(字节)
其中bytes是来自
ByteArrayOutputStream的数组。
您不需要使用ImageIO,它只会徒劳地进行图像处理。顺便说一句,您知道
URLConnection
实际上提供了一种方法
getContentLength()
,该方法会给出您将要接收的内容的大小,对吗?虽然它有点依赖于Web服务器,但有时并不总是提供(HTTP 1.1需要它,但有些实现不正确)