java批量下载图片(通用版)

  • 目前存在问题,单线程下载慢,因为readLine是一次读一行,我不知道该怎么加多线程,有想法可以告知下,不胜感激。
  • 可以不用看代码,直接按照实际情况修改20,26,32,34行代码即可。
  • 附上本文用到的txt文件,只给格式参考,真实url做了隐藏。
    BC2001330http://example.com/ybraas3lm6yrtb2u2n.jpg
    BC2001331http://example.com/cgcouxu9cp3viyelya.jpg
    BC2001332http://example.com/8rbvbd2ipwmjyzdkbh.jpg
/**
 * @Author DemoRookie
 * @Version 1.0
 */

import java.io.*;
import java.net.*;

public class DownLoadImage {
	public static void main(String args[]) {
		new Thread(new downImage()).start();
	}

	public static class downImage implements Runnable {

		@Override
		public void run() {
			long startTime = System.currentTimeMillis();
			try {
				FileReader file = new FileReader("D:\\DownloadImageSet\\image.txt");//获取文件流位置
				BufferedReader br = new BufferedReader(file);//构造一个BufferedReader类来读取文件
				String imgUrl, picName, document;
				// 使用readLine方法,一次读一行
				while ((document = br.readLine()) != null) {
					//读取当前行截取字符作为图片名(前九个字符,根据实际情况自定制)
					picName = document.substring(0, 9) + ".jpg";
					/*
					* 这里中间多个“s”是因为图片链接开启了强制https,
					* 如果没有这种情况就imgUrl = document.substring(9)即可,
					* 代表第九位字符之后的全部字符,根据实际情况自定制
					*/
					imgUrl = document.substring(9, 13) + "s" + document.substring(13);
					// System.out.println(imgUrl);
					downImages("D:\\downloadImage\\", imgUrl, picName);//输出文件流位置“D:\\downloadImage\\”
					// System.out.println(Thread.currentThread().getName() + "正在下载图片:" + picName);
				}
				br.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			long endTime = System.currentTimeMillis();
			System.out.println("程序运行时间:" + (endTime - startTime) + "ms");
		}
	}

	private static void downImages(String filePath, String imgUrl, String picName) {
		File Dir = new File(filePath);//若存取文件夹没有,则先创建
		if (!Dir.exists()) {
			Dir.mkdirs();
		}
		try {
			String fileName = imgUrl.substring(imgUrl.lastIndexOf('/') + 1);//截取图片文件名
			/*
			* 文件名里面可能有中文或者空格,所以这里要进行处理,
			* 但空格又会被URLEncoder转义为加号,
			* 因此要将加号转化为UTF-8格式的%20
			* */
			String urlTail = URLEncoder.encode(fileName, "UTF-8");
			imgUrl = imgUrl.substring(0, imgUrl.lastIndexOf('/') + 1) 
					+ urlTail.replaceAll("\\+", "\\%20");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}

		File file = new File(filePath + picName);//写出路径
		InputStream inStream;

		try {
			URL url = new URL(imgUrl);// 构造URL
			URLConnection con = url.openConnection();// 打开连接
			inStream = con.getInputStream();
			ByteArrayOutputStream outStream = new ByteArrayOutputStream();//中转站,现将图片数据放到outStream中
			byte[] buf = new byte[1024];
			int len;
			while ((len = inStream.read(buf)) != -1) {
				outStream.write(buf, 0, len);
			}
			inStream.close();
			outStream.close();
			FileOutputStream op = new FileOutputStream(file);//图片下载的位置
			op.write(outStream.toByteArray());
			op.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

你可能感兴趣的:(java批量下载图片(通用版))