今天做一个爬虫,使用正则匹配到<img>
标签以后,直接用InputStream
流进行下载到内存,然后再使用FileOutputStream
保存到硬盘,但是要获取图片文件格式再进行保存。
一开始使用了正则截取,比如<img src="/book/en/v2/images/basic-branching-1.png" />
,就直接用字符串截取.png
的内容
String imgSrc = "/book/en/v2/images/basic-branching-1.png";
String formatName = imgSrc.split("\\.")[1];
但是后来突然想到如果URL的path里就带有 .
那怎么办(虽然我没见到过)
假设一个图片标签 <img src="/book/en/v2/.hahaha/basic-branching-1.png" />
,那这样就不能保证是截取到后缀。
想到PHP和Python都有直接处理图片的库,很方便,Java应该也有这种操作吧。
经过去StackOverflow查找一番,发现确实Java这种操作很麻烦,所以自己实现了一个工具方法。
public static List<String> getImageFormat(InputStream srcInputStream) throws IOException {
List<String> formatNameList = new ArrayList<>();
// 获取ImageInputStream 对象
ImageInputStream imageInputStream = ImageIO.createImageInputStream(srcInputStream);
// 获取ImageReader对象的迭代器
Iterator<ImageReader> iterator = ImageIO.getImageReaders(imageInputStream);
// 如果能获得ImageReader对象则说明流中含有图片文件
while(iterator.hasNext()) {
// ImageReader对象的getFormatName()方法可以获得图片格式
formatNameList.add(iterator.next().getFormatName());
}
return formatNameList;
}
这样我们就能从连续的图片文件流中获取多个图片文件,实现获取文件真实格式到的后缀。