我使用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?
答案 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)