1. ファイル拡張子に基づいて決定します
利点: 高速、シンプルなコード
欠点: 一部の偽のファイルやサフィックス名のないファイルなど、実際のファイルの種類を判断できません
2。ファイル フロー 最初の数文字を決定する
利点: 実際のファイル タイプを決定できる
欠点: 速度が遅く、コードが複雑
以下では、各メソッドをテストして検証します。テスト ファイルは次のとおりです。
Java 1.7 以降、MIME タイプを解決するメソッドが提供されています。 Files.probeContentType:
public static void test() throws IOException { Path path = new File("d:/test.png").toPath(); String mimeType = Files.probeContentType(path); System.out.println(mimeType); }結果:
#このメソッドは、インストールされている FileTypeDetector 実装を利用して MIME タイプを検出します。各実装のprobeContentTypeを呼び出してタイプを解決します。
ただし、デフォルトの実装はオペレーティング システム固有であり、使用しているオペレーティング システムによっては失敗する可能性があります。
#結論: ファイル拡張子に基づいて判断してください。
2. URLConnection の使用
URLConnection は、ファイルの MIME タイプを検出するための API をいくつか提供します。
2.1 getContentType の使用public void test(){ File file = new File("d:/test.png"); URLConnection connection = file.toURL().openConnection(); String mimeType = connection.getContentType(); }
結果:
##結論: ジャッジファイル ストリームの最初の数文字に基づきます。実際のファイルの種類を特定できますが、この方法の主な欠点は非常に遅いことです。 2.2guessContentTypeFromName
public void test(){ File file = new File("d:/test.png"); String mimeType = URLConnection.guessContentTypeFromName(file.getName()); }
の使用結果:
##このメソッドは、内部 FileNameMap を使用して MIME タイプを決定します。
#結論: ファイル拡張子に基づいて判断してください。
#2.3guessContentTypeFromStreamの使用#
public static void test() throws Exception { FileInputStream inputFile = new FileInputStream("d:/test.doc"); String mimeType = URLConnection.guessContentTypeFromStream(new BufferedInputStream(inputFile)); System.out.println(mimeType); }#Result
:
# #結論: ファイル ストリームの最初の数文字に基づいて判断してください。
2.4 getFileNameMap の使用
URLConnection を使用して MIME タイプを取得するより迅速な方法は、getFileNameMap() メソッドを使用することです:
public void test(){ File file = new File("d:/test.png"); FileNameMap fileNameMap = URLConnection.getFileNameMap(); String mimeType = fileNameMap.getContentTypeFor(file.getName()); }
結果 :
このメソッドは、URLConnection のすべてのインスタンスで使用される MIME タイプ テーブルを返します。このテーブルは、入力ファイルの種類を解析するために使用されます。
MIME タイプの組み込みテーブルは、URLConnection に関しては非常に限られています。
デフォルトでは、このクラスは content-types.properties ファイルを使用し、そのディレクトリは JRE_HOME/lib です。ただし、content.types.user.table プロパティを使用してユーザー固有のテーブルを指定することで、これを拡張できます。 System.setProperty("content.types.user.table","<path-to-file>");</path-to-file>
3. MimeTypesFileTypeMap を使用する
このクラスは Java 6 に付属しているため、JDK 1.6 を使用する場合に非常に便利です。public void test() { File file = new File("product.png"); MimetypesFileTypeMap fileTypeMap = new MimetypesFileTypeMap(); String mimeType = fileTypeMap.getContentType(file.getName()); }結果:
ここで、ファイル名またはファイル インスタンス自体をパラメーターとして関数に渡すことができます。ただし、File インスタンスを引数として受け取る関数は、ファイル名を引数として受け取るオーバーロードされたメソッドを内部的に呼び出します。
このメソッドは内部的に、型解決のために mime.types という名前のファイルを探します。この方法は特定の順序でファイルを検索することに注意することが重要です:Hongmeng 公式戦略的協力と共同構築 - HarmonyOS Technology Community
プログラムによって、ユーザーの META-INF/mime.types という名前の MimetypesFileTypeMap インスタンスmime.types
<dependency> <groupid>net.sf.jmimemagic</groupid> <artifactid>jmimemagic</artifactid> <version>0.1.5</version> </dependency>次に、このライブラリの使用方法を検討します:
public void test() { File file = new File("d:/test.doc"); MagicMatch match = Magic.getMagicMatch(file, false); System.out.println(match.getMimeType()); }
结论:根据文件流中前几个字符判断。
5. 使用Apache TikaApache Tika
是一个工具集,可检测并从各种文件中提取元数据和文本。它具有丰富而强大的API,并带有[tika-core],我们可以利用它来检测文件的MIME类型。
配置Maven依赖:
<dependency> <groupid>org.apache.tika</groupid> <artifactid>tika-core</artifactid> <version>1.18</version> </dependency>
接下来,我们将使用detect()方法来解析类型:
public void whenUsingTika_thenSuccess() { File file = new File("d:/test.doc"); Tika tika = new Tika(); String mimeType = tika.detect(file); }
结果:
结论:根据文件流中前几个字符判断。
以上がJavaでファイルタイプを判断する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。