如何使用java检查文件是否是png图像文件

时间:2013-10-04 06:45:07

标签: java

我将自动化png建成jpg,一切都很大,但我在检测png文件时遇到问题,现在我正在使用文件名,我正在检查结尾,如果它匹配“.png”但这不是为png文件而不是以“.png”结尾的文件工作。 任何想法?

4 个答案:

答案 0 :(得分:2)

您可以检查文件的标题 请参阅http://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header

答案 1 :(得分:1)

您可以使用Files.probeContentType(path)获取mime类型

答案 2 :(得分:1)

你可以尝试这个

import javax.activation.MimetypesFileTypeMap;
import java.io.File;

class GetMimeType {
  public static void main(String args[]) {
    File f = new File(filePath);
    System.out.println("Mime Type of " + f.getName() + " is " +
                         new MimetypesFileTypeMap().getContentType(f));

}

尝试

public String getContentType(File file) throws IOException {
        return Files.probeContentType(file.getAbsolutePath());
}

答案 3 :(得分:0)

我使用搜寻器从网站下载了一些图像。源中所有图像均以JPG格式列出,但其中混入了一些PNG。浏览器非常灵活,因为网络杂乱无章,但并非所有桌面应用程序都能正确处理扩展名为.jpg的PNG文件。我在接受的答案中尝试了各种解决方案,但是所有解决方案都使用文件名来标识MIME类型。我检查了MimetypesFileTypeMap的源(java8),即使您将其传递给File,它也只是获取文件名并使用它来确定mime类型。

因此,相反,我选择了读取4字节的文件标头,以确定它是Itay Karo所建议的JPG还是PNG。对于JPG,第一个字节为FF,对于PNG,第一个字节为89(HEX)。

private static boolean isPng(File file) throws IOException {
    try (FileInputStream is = new FileInputStream(file)) {
        return Integer.toHexString(is.read).equals("89");
    }
}

等于139(以10为基数),因此效率更高的解决方案是:

private static boolean isPng(File file) throws IOException {
    try (FileInputStream is = new FileInputStream(file)) {
        return is.read() == 137;
    }
}

请注意,这足以区分JPG和PNG,但如果您真的不知道要处理的文件类型,则可能还需要检查其余字节以提高准确性。向Itay Karo提供有关PNG标头的描述的道具:

http://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header

哦,还有我要提的一件事。在Linux中,您可以使用“文件”查询mime类型:

file -i [file]

问题无法解决,但编写在Java应用程序之后运行的简单shell脚本可能会更容易:

for file in $(find "$root" -name '*.jpg')
do
        if file -i "$file" | grep -q 'image/png'; then
                rename="${file%.*}.png"
                echo "moving $file -> $rename"
                mv $file $rename
        fi
done
相关问题