我知道我们可以通过扩展或mime类型来完成它,我们是否有任何其他方式可以获得文件类型的概念,无论是.docx还是.doc。
答案 0 :(得分:1)
如果只是确定一个已知的文件集合是res.df <- do.call(rbind, lapply(1:nrow(idx.mat), function(i){
gi.length <- length(l[[idx.mat[i,1]]])
gj.length <- length(l[[idx.mat[i,2]]])
set.diff.1 <- length(setdiff(l[[idx.mat[i,1]]],l[[idx.mat[i,2]]]))
set.diff.2 <- length(setdiff(l[[idx.mat[i,2]]],l[[idx.mat[i,1]]]))
gi.gj.inter <- length(intersect(l[[idx.mat[i,1]]],l[[idx.mat[i,2]]]))
gi.gj.union <- length(unique(c(l[[idx.mat[i,1]]],l[[idx.mat[i,2]]])))
p.value <- fisher.test(matrix(c(gi.length+gj.length- gi.gj.union,set.diff.1,set.diff.2,gi.gj.inter),nrow=2),alternative="greater")$p.value
return(data.frame(gi=names(l)[idx.mat[i,1]],
gj=names(l)[idx.mat[i,2]],
gi.gj.inter=gi.gj.inter,
gi.gj.union=gi.gj.union,
gi.gj.iou=gi.gj.inter/gi.gj.union,
gi.gj.iou.p.val=p.value,
stringsAsFactors=F))
}))
还是.doc
但是没有相应标记扩展名的问题,您可以使用{{1}这一事实file是压缩文件集合。如下调整可能会有所帮助:
.docx
其中.docx
是您要评估的任何文件或其他输入流。您可以通过查找关键boolean isZip = new ZipInputStream( fileStream ).getNextEntry() != null;
条目来进一步评估压缩文件。一个好的起始参考是Word Document (DOCX)。同样,如果您知道它只是一个二进制文件,您可以测试Word的文件信息块(请参阅Word (.doc) Binary File Format)
答案 1 :(得分:0)
您可以使用Apache Tika进行内容检测。但是你应该意识到这对于这么小的任务来说是一个巨大的框架(许多必需的依赖项)。
答案 2 :(得分:0)
有一种方法,但没有前进的道路。但是使用Apache POI,您可以找到它。
尝试使用HWPFDocument Class读取.docx文件。它会给你以下错误
org.apache.poi.poifs.filesystem.OfficeXmlFileException:提供的 数据似乎在Office 2007+ XML中。你在呼唤这部分 POI处理OLE2 Office文档。你需要打电话给 POI的不同部分来处理这些数据(例如XSSF而不是HSSF)
String filePath = "C:\\XXXX\XXXX.docx";
FileInputStream inStream;
try {
inStream = new FileInputStream(new File(filePath));
HWPFDocument doc = new HWPFDocument(inStream);
WordExtractor wordExtractor = new WordExtractor(doc);
System.out.println("Getting words"+wordExtractor.getText());
} catch (Exception e) {
System.out.print("Its not a .doc format");
}
.docx可以使用XWPFDocument Class读取。
答案 3 :(得分:0)
为什么不使用Apache Tika
:
File file = new File('File Here');
Tika tika = new Tika();
String filetype = tika.detect(file);
System.out.println(filetype);
答案 4 :(得分:0)
假设您正在使用Apache POI,您有几个选择。
一个是获取文件的前几个字节,ask POIFSFileSystem with the hasPOIFSHeader(byte) method。如果您有支持标记/重置的流,则可以使用POIFSFileSystem.hasPOIFSHeader(InputStream)。如果这些人返回true
,请尝试使用.doc
将其作为HWPF
打开,否则请.docx
与XWPF
一起使用
否则,如果您更喜欢尝试/捕获方式,请尝试使用POIFSFileSystem
打开它并捕获OfficeXmlFileException
- 如果它打开正常,则为.doc
,如果您获得异常,则为.docx
{1}}
如果查看source code for WorkbookFactory,您将看到正在使用的第一个模式,您可以复制一组类似的逻辑形式