Apache Tika Api消耗给定的流

时间:2014-11-12 15:49:56

标签: apache stream mime-types apache-tika

我使用Apache Tika bundle依赖项来查找文件的MimeTypes。由于一些问题,我们必须通过InputStream找出。它实际上保证标记/重置给定的InputStream。 Tika-Bundle包括核心和解析器api,并使用PoifscontainerDetector,ZipContainerDetector,OggDetector,MimeTypes和Magic进行检测。我已经调试了3个小时,所有探测器在检测后都标记并重置。我是按照以下方式做到的。

  TikaInputStream tis = null;
    try {
        TikaConfig config = new TikaConfig();
        tikaDetector = config.getDetector();
        tis =  TikaInputStream.get(in);
        MediaType mediaType = tikaDetector.detect(tis, new Metadata());

        if (mediaType != null) {
            String[] types = mediaType.toString().split(",");

            for (int i = 0; i < types.length; i++) {
                mimeTypes.add(new MimeType(types[i]));
            }
        }

    } catch (Exception e) {
        logger.error("Mime Type for given Stream could not be resolved: ", e);
    } 

但Stream被消耗了。有没有人知道如何在不消耗Stream的情况下找出MimeTypes?

1 个答案:

答案 0 :(得分:2)

在我最终解决之前,这个问题一直困扰着我。问题是,虽然需要Detector.detect()方法来标记和重置流,但如果该流不支持标记,则此重置对原始流(in变量)没有影响。 / p>

为了让这个工作,我必须首先将我的流转换为BufferedInputStream,然后再做其他事情。然后我将该缓冲流传递给检测算法,稍后我将使用相同的缓冲流进行解析,读取或我需要做的任何事情。

BufferedInputStream buffStream = new BufferedInputStream(in);
TikaInputStream tis = null;
try {
    TikaConfig config = new TikaConfig();
    tikaDetector = config.getDetector();
    tis =  TikaInputStream.get(buffStream);
    MediaType mediaType = tikaDetector.detect(tis, new Metadata());

    if (mediaType != null) {
        String[] types = mediaType.toString().split(",");

        for (int i = 0; i < types.length; i++) {
            mimeTypes.add(new MimeType(types[i]));
        }
    }

} catch (Exception e) {
    logger.error("Mime Type for given Stream could not be resolved: ", e);
} 

// further along in my code...

doSomething(buffStream); // rather than doSomething(in)