[英]how to check if a file is an png image file,using java
我正在构建一个自动 png 到 jpg,一切都已构建,但我在检测 png 文件时遇到问题。 现在我正在使用文件名:我正在检查文件的结尾是否与.png
匹配,但这不适用于不以.png
结尾的 png 文件。
有什么想法吗?
您可以检查文件的标题。
请参阅http://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header 。
你可以试试这个
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());
}
您可以使用Files.probeContentType(path)
来获取 MIME 类型
我使用爬虫从网站下载了一些图像。 所有的图片在源代码中都被列为JPG,但也有一些PNG 混入。浏览器很灵活,因为网络很乱,但并不是所有的桌面应用程序都能正确处理带有.jpg 扩展名的PNG 文件。 我在接受的答案中尝试了各种解决方案,但所有解决方案都使用文件名来标识 MIME 类型。 我检查了 MimetypesFileTypeMap 的源代码 (java8),即使您传递给它一个文件,它也只会获取文件名并使用它来确定 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 中,您可以使用“file”来查询 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.