Java获取图片文件格式(后缀)

今天做一个爬虫,使用正则匹配到<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;
    }

这样我们就能从连续的图片文件流中获取多个图片文件,实现获取文件真实格式到的后缀。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
package com.ylw.p2p.common.utils; import java.awt.image.BufferedImage; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import javax.imageio.ImageIO; import javax.imageio.ImageReader; import javax.imageio.stream.ImageInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class FileUtils { public final static Map IMG_FILE_TYPE_MAP = new HashMap(); /** * @Description: 图片文件上传 * @author Xiao.Sky * @creaetime 2015年4月17日下午5:20:27 * @param request * @param response * @param photo * @param strtmp * 文件名称 xxx.jpg * @param path * 文件路径 * @param num * @return */ public static boolean updatePhoto(HttpServletRequest request,HttpServletResponse response, File photo, String strtmp,String path, long num) { File dir = new File(path); // 如果不存在就创建次文件夹 if (!dir.exists()) { dir.mkdirs(); } File newFile = new File(dir, strtmp); // 如果存在此文件就删除此文件 if (newFile.exists()) newFile.delete(); BufferedInputStream bis = null; FileInputStream fis = null; try { fis = new FileInputStream(photo); FileOutputStream fos = new FileOutputStream(newFile); BufferedImage src = ImageIO.read(fis); ImageIO.write(src, "png", fos); } catch (Exception e) { e.printStackTrace(); } finally { try { if (null != bis) { bis.close(); } if (null != fis) { fis.close(); } } catch (IOException e) { e.printStackTrace(); } } return true; } /** * * @Description: 普通文件上传 * @author Xiao.Sky * @creaetime 2015年4月23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值