簡體   English   中英

如何使用java檢查文件是否是png圖像文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM