4

currentFileMIME タイプのチェックが必要です。結果が成功で、ファイルが MIME-type の場合return true。チェックが成功しなかった場合return false
この目標のために、私はJMimeMagicを使用します。この投稿に従ってこれ
を試してみます

このコードからの出力は -net.sf.jmimemagic.MagicMatchNotFoundException

この方法で File を byte[] に変更するには、 JDK 7が必要です( Files.readAllBytes(path))。

コード:

    class ProbeContentTypeCheker implements Checker {

    @Override
    public boolean check(File currentFile) {
        String mimeType = null;
        try {
            Path path = Paths.get(currentFile.getAbsolutePath());
            byte[] data = Files.readAllBytes(path);
            MagicMatch match = Magic.getMagicMatch(data);
            mimeType = match.getMimeType();
        } catch (MagicParseException | MagicMatchNotFoundException
                | MagicException | IOException e) {
            e.printStackTrace();
        }

        if (null != mimeType) {
            return true;
        }

        return false;
    }
}

出力 (「間違った」タイプの場合のみ):

 net.sf.jmimemagic.MagicMatchNotFoundException
    at net.sf.jmimemagic.Magic.getMagicMatch(Magic.java:222)
    at net.sf.jmimemagic.Magic.getMagicMatch(Magic.java:170)
    at task.ProbeContentTypeCheker.check(FileScan.java:357)
    at task.FolderScan.findFiles(FileScan.java:223)
    at task.FolderScan.findFiles(FileScan.java:215)
    at task.FolderScan.run(FileScan.java:202)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)  

ファイルが「ok」の場合 => 通常のコンソールに出力します。しかし、しばらくすると別の例外が発生します:

Exception in thread "pool-1-thread-1" java.lang.OutOfMemoryError: Java heap space
    at java.lang.String.toCharArray(String.java:2753)
    at org.apache.oro.text.perl.Perl5Util.match(Unknown Source)
    at net.sf.jmimemagic.MagicMatcher.testRegex(MagicMatcher.java:663)
    at net.sf.jmimemagic.MagicMatcher.testInternal(MagicMatcher.java:433)
    at net.sf.jmimemagic.MagicMatcher.test(MagicMatcher.java:341)
    at net.sf.jmimemagic.Magic.getMagicMatch(Magic.java:208)
    at net.sf.jmimemagic.Magic.getMagicMatch(Magic.java:170)
    at task.ProbeContentTypeCheking.check(FileScan.java:384)
    at task.FolderScan.findFiles(FileScan.java:228)
    at task.FolderScan.findFiles(FileScan.java:225)
    at task.FolderScan.findFiles(FileScan.java:225)
    at task.FolderScan.run(FileScan.java:209)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)

質問:

  • これを解決するにはどうすれば例外が発生しますか?
4

1 に答える 1

3

JMimeMagic 0.1.2は Commons Logging 1.0.4 に依存しますNoClassDefFoundErrorは、Java 仮想マシンまたは ClassLoader インスタンスが (通常のメソッド呼び出しの一部として、または新しい式) であり、クラスの定義が見つかりませんでした。解決策は、commons-logging-1.0.4.jar をクラスパスに追加することです。

JMimeMagic には他のサードパーティの依存関係があることに注意してください。

  1. ジャカルタ ORO 2.0.8
  2. Log4j 1.2.8
  3. Xerces 2.4.0 (オプション)
  4. xml-apis 2.0.2
  5. xmlParserAPI 2.0.2

更新 - MagicMatchNotFoundException

指定されたデータに一致する MIME タイプが見つからない場合、MagicMatchNotFoundException がスローされますログ レベルnet.sf.jmimemagicを DEBUG に設定して、何が起こっているかについての詳細情報を取得できます。

更新 2 - OutOfMemoryError

OOM は、JmimeMagic の動作に関連しているように見えます。場合によっては、バイト配列入力全体に対して正規表現を実行して、マジック ナンバーの一致を見つけようとします。Nuxeo Enterprise Platform について報告されたこの問題を参照してください。
渡すバイト配列のサイズを制限することで、この問題を解決できると思いますgetMagicMatch

于 2013-03-10T22:26:28.033 に答える