gpt4 book ai didi

java - 使用java从包含100个图像url的文本文件中提取图像

转载 作者:行者123 更新时间:2023-11-30 03:22:45 25 4
gpt4 key购买 nike

我有一个文本文件,其中逐行包含大量图像网址。我需要获取一个 Java 代码来自动提取这些图像并将这些图像保存到文件中。我知道如何从单个 URL 保存图像,但如何修改代码以执行多线程?我想获取一个文件夹下的所有图像及其原始文件名。我尝试用谷歌搜索很多代码,但一切都失败了。请帮我找到解决方案。我们将非常感谢您的回答。

我用来保存单个图像的代码是:

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;

public class SaveImageFromUrl {
public static void main(String[] args) throws Exception {
String imageUrl = "http://http://img.emol.com/2015/04/25/nepalterremoto02ok_2260.jpg";
String destinationFile = "/home/abc/image.jpg";
saveImage(imageUrl, destinationFile);
}

public static void saveImage(String imageUrl, String destinationFile) throws IOException {
URL url = new URL(imageUrl);
InputStream is = url.openStream();
OutputStream os = new FileOutputStream(destinationFile);

byte[] b = new byte[2048];
int length;

while ((length = is.read(b)) != -1) {
os.write(b, 0, length);
}
is.close();
os.close();
}
}

最佳答案

您可以利用预先存在的 API...

  • 使用Files.readAllLines读取文件
  • ImageIO.readImageIO.write 下载文件
  • Executor API 用于运行并发任务以帮助加快速度

所以,基本上,从每个 URL 下载图像都是相同的过程,可以封装成一个简单的任务。

public class DownloadImageFromURLTask implements Callable<File> {

private URL url;
private String path;

public DownloadImageFromURLTask(URL url, String path) {
this.url = url;
this.path = path;
}

@Override
public File call() throws Exception {

BufferedImage img = ImageIO.read(url);
String name = url.getPath();
name = name.substring(name.lastIndexOf("/"));
File output = new File(path, name);
ImageIO.write(img, "jpg", output);

return output;
}

}

我在这里使用了Callable,因为它将插件到Executor API中并允许我获取返回结果,即File code> 图像下载位置。

接下来,我们需要从文本文件中读取 URL 并构建要执行的任务列表...

        List<String> listOfURLs = Files.readAllLines(new File("ListOfURLs.txt").toPath());
List<DownloadImageFromURLTask> listOfTasks = new ArrayList<>(listOfURLs.size());
String path = "/home/abc";
for (String url : listOfURLs) {
listOfTasks.add(new DownloadImageFromURLTask(new URL(url), path));
}

为了简单起见,我刚刚使用了Files.readAllLines

接下来,我们需要执行所有任务...

        ExecutorService exector = Executors.newFixedThreadPool(4);
List<Future<File>> listOfFutures = exector.invokeAll(listOfTasks);

这使用固定大小的线程池,这允许我们进行一些性能调整,因为每个任务都将被池化,直到有线程可用于运行它。

此处使用 invokeAll 是阻塞调用,这意味着在所有任务完成或失败之前,它不会返回。方便。

(可选)您可以处理 Future 的结果 List,它们携带 Callable 的返回结果

        for (int index = 0; index < listOfFutures.size(); index++) {
Future<File> future = listOfFutures.get(index);
try {
File file = future.get();
} catch (ExecutionException ex) {
String url = listOfURLs.get(index);
System.out.println("Failed to download image from " + url);
ex.printStackTrace();
}
}

在此示例中,它正在处理列表以查找失败的任务。

看看Reading/Loading an Image , Writing/Saving an Image , ExecutorsReading, Writing, and Creating Files了解更多详情

关于java - 使用java从包含100个图像url的文本文件中提取图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30961513/

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