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