我在项目中使用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)