Apache Tika Api正在消耗给定的流



我在项目中使用Apache Tika捆绑包依赖项来查找文件的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吗?

这个问题在我最终解决之前也困扰了我一段时间。问题是,虽然Detector.detect()方法需要标记和重置流,但如果流中不支持标记,则此重置将不会对原始流(in变量)产生影响。

为了实现这一点,我必须先将流转换为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)

相关内容

  • 没有找到相关文章

最新更新