如何通过java程序批量下载远程服务器的图片

本章主要介绍怎么通过写一个java程序来获取远程服务器的图片,并把图片压缩到压缩包里并下载下来。前提是,图片的名称是有规律的,比如都是数字组成,既然都是数字组成的,那么就可以通过for循环来实现,比如下载文件名为1.png到1000.png的图片。

当我们下载服务器https://com.example/img/item/下的图片xxx.png,如果图片不存在,下面这句代码会发生异常,发生异常时直接使用continue跳过即可,继续我们的for循环。

inputStream = connection.getInputStream();

这种方式的优缺点如下:

优点:代码简单,没有使用非常复杂的API

缺点:速度很慢,因为要在for循环里频繁创建对象

@RestController
@Api(tags = "用户控制器类")
@RequestMapping(path = "/user", produces="application/json;charset=utf-8")
public class UserController {

    @ApiOperation("获取图片资源")
	@RequestMapping(value = "/getResources", method = RequestMethod.GET)
	public void getResources(HttpServletResponse response, int from, int to)  {
		ZipOutputStream outputStream = null;
		InputStream inputStream = null;

		try {
			StringBuilder filename = new StringBuilder();
			
			// 压缩文件夹名:"图片资源" + from + "-" + to + ".zip"
			StringBuilder zipName = new StringBuilder();
			
			zipName.append("图片资源");
			zipName.append(from);
			zipName.append("-");
			zipName.append(to);
			zipName.append(".zip");
			
			// 文件名中文乱码问题
			String fileName = URLEncoder.encode(zipName.toString(), "utf-8");

			// 设置响应头
			response.setContentType("application/octet-stream");
			response.setHeader("Content-Disposition", "attachment;filename=" + fileName);

			ServletOutputStream sos = response.getOutputStream();
			outputStream = new ZipOutputStream(sos);

			// 遍历创建URL
			for (int i = from; i <= to; i++) {
				if (filename.length() > 0) {
					filename.delete(0, filename.length());
				}
				filename.append("/img/item/").append(i).append(".png");

				try {
					URL url = new URL("https", "com.example", filename.toString());

					inputStream = url.openConnection().getInputStream();
				} catch (IOException e) {
					continue;
				}

				outputStream.putNextEntry(new ZipEntry(i + ".png"));

				byte[] buffer = new byte[1024];
				int len;

				while ((len = inputStream.read(buffer)) != -1) {
					outputStream.write(buffer, 0, len);
				}
			}
		} catch (IOException ignored) {}

		try {
			if (inputStream != null) {
				inputStream.close();
			}
			if (outputStream != null) {
				outputStream.flush();
				outputStream.close();
			}
		} catch (IOException ignored) {}
	}

}

如果有更简单高效的方法,欢迎在评论区讨论~

Java中,你可以使用Socket或HTTP客户端库(如Apache HttpClient或OkHttp)连接到远程服务器下载文件,并利用Java提供的I/O流处理和文件操作功能将这些文件打包成压缩文件。以下是一个简化的步骤概述: 1. **导入必要的库**: - 导入`java.io`, `java.nio.file`, `java.util.zip`, 和网络通信相关的库。 2. **创建连接**: 使用`URL`和`URLConnection`(对于HTTP)或`Socket`(对于TCP/IP)建立到远程服务器的连接。 3. **下载文件**: - 创建输入流 (`InputStream`),然后使用`BufferedInputStream`优化读取性能。 - 创建一个临时文件存储下载的内容,例如通过`FileOutputStream`。 - 循环读取并写入文件,直到下载完成。 4. **创建压缩文件**: - 使用`ZipOutputStream`或`Files.newOutputStream(Paths.get("archive.zip"))`创建一个新的压缩文件。 - 将每个下载的文件添加到压缩文件中,使用`ZipEntry`实例表示文件在压缩文件内的路径。 5. **关闭资源**: 下载完成后,记得关闭所有打开的流,释放资源。 6. **异常处理**: 对可能出现的网络错误、IO错误等进行适当的捕获和处理。 下面是一个简化版的示例代码片段,注意这只是一个基础框架,实际应用中需要处理更多的细节和异常情况: ```java import java.io.*; import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class FileDownloaderAndCompressor { public static void main(String[] args) throws IOException { URL remoteUrl = new URL("http://example.com/file1.txt"); String[] fileNames = {"file1.txt", "file2.txt"}; try (InputStream in = remoteUrl.openStream(); ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream("archive.zip"))) { for (String fileName : fileNames) { byte[] buffer = new byte[4096]; int bytesRead; Path tempFilePath = Files.createTempFile(fileName, null); try (FileOutputStream out = new FileOutputStream(tempFilePath.toFile())) { while ((bytesRead = in.read(buffer)) != -1) { out.write(buffer, 0, bytesRead); } } // Add the file to the ZIP archive ZipEntry zipEntry = new ZipEntry(fileName); zipOut.putNextEntry(zipEntry); Files.copy(tempFilePath, zipOut); zipOut.closeEntry(); tempFilePath.toFile().delete(); // Delete the temporary file after adding it to the archive } } catch (IOException e) { e.printStackTrace(); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值