假设我们有这个 URL
“mysite.com”
在此站点中,我们有一个名为 images 的目录,其中包含大约 200 张 .PNG 图片
我想制作一个程序,一张一张地扫描这些图片(如果你知道上一张图片的URL,你可以预测图片的URL),然后我想在我的JFrame上显示这张图片
我最初的想法是,既然我知道 URL,为什么不扫描所有不同的图像 URL,然后执行此操作呢?
Image image = ImageIO.read(url); hasImage.setIcon(new
ImageIcon(image));
现在
hasImage
是一个 JLabel,我使用刚刚从 URL 下载的图像
和
url
是 URL 类的对象
因此,每次在循环中我都会找到新的 URL,然后调用包含我刚刚在上面发布的两行代码的函数,以便更新标签上的图像
请注意,这两行位于按钮 ActionListener 内,因此每次单击该按钮时,都会显示下一张图像
这里有 1 个主要问题。
当我想显示下一张图像时,需要一些时间来创建新的 url 对象,下载图像,然后将其显示在我的标签上,这有点烦人,特别是如果您很着急并且想要快速显示图像...
现在,我想到了另一种实现方式,为什么不直接下载所有图像,将它们保存在本地某个位置,然后扫描存储图像的目录并在每次单击按钮时显示它们?
好的,我这样做了,但问题是下载所有图像需要一分多钟的时间 之后它就可以顺利运行,速度非常快
所以这里的一个大问题是下载图像需要花费很多时间,所以它基本上是以前的实现,但是在这个实现中,我不是在按下按钮时等待一点,而是等待一切都完成下载,这需要相同的时间...
我的问题是,怎样才能让它更快?如果它能在 5 秒内下载所有图像,我会很满意
这是我用来保存图像的函数
private void saveImages() {
Image image;
int ID = 1;
String destFile = "destFolder" + ID + ".png";
try {
image = ImageIO.read(url);
ImageIO.write((RenderedImage) image, "png", new File(destFile));
} catch (IOException ex) {
}
while (ID < 200) {
try {
String path = url.getPath();
String[] token = path.split("-");
String[] finalToken = token[2].split("\\.");
ID = Integer.parseInt(finalToken[0]);
url = new URL("http://somesite/images/" + (ID + 1) + ".png");
destFile = "C:\\...\\destFolder\\" + ID + ".png";
image = ImageIO.read(url);
ImageIO.write((RenderedImage) image, "png", new File(destFile));
} catch (MalformedURLException ex) {
JOptionPane.showMessageDialog(null,
"URL is not in the correct form", "Malformed URL",
JOptionPane.ERROR_MESSAGE);
} catch (IOException ex) {
}
}
JOptionPane.showMessageDialog(null, "Images were loaded successfully",
"Success", JOptionPane.INFORMATION_MESSAGE);
}
编辑:顺便说一句,我对代码感到非常抱歉,它有点困惑,这只是我输入的第一件事......我稍后会对其进行更好的更改,但我希望您了解我遇到的问题我现在面临着:)
最佳答案
Java 或实现都不是问题,问题在于连接速度。要么下载应用程序所需的所有图像(这需要一些时间,并且如果未查看图像则毫无意义),要么在单击图像时加载它们。
如果您想让它看起来更快一点,您可以开始将图像加载到本地数据库或文件系统(如缓存)中。这显然有其缺点,因为一旦图片加载一次,它只会使加载时间更快,并且通常理想的情况是没有很大的缓存。
您还可以在仅查看一张图像时加载下一张和上一张左右的五个图像,这将使用户感觉速度更快。
关于java - 使用JAVA可以快速从网站下载图片吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8364073/