我想找出docx,pptx等内容的大小。有没有可用于此的包?我用Google搜索并发现POI被广泛用于读取/写入MS文件类型。但是无法找到正确的api来查找文件内容的大小。我想知道实际的内容大小,而不是从属性中可以看到的压缩文件大小。
最后我找到了方法,但如果文件太大,它会抛出OOM异常。
OPCPackage opcPackage = OPCPackage.open(file.getAbsolutePath());
XWPFDocument doc = new XWPFDocument(opcPackage);
XWPFWordExtractor we = new XWPFWordExtractor(doc);
String paragraphs = we.getText();
System.out.println("Total Paragraphs: "+paragraphs.length() / 1024);
如果还有其他更好的方法可以帮助我。
答案 0 :(得分:0)
好的,这已经很久以前被问过,而且这个问题也没有回应。我没有使用OPCPackage,因此我的答案不是基于此。
DOCX(以及PPTX和XSLX)文件都是具有特定结构的zip文件。 因此,我们可以使用 java.util.zip 包并枚举zip文件的条目,并获取xlsx文件和字的zip条目 xl 的大小用于docx文件。可能更通用的方法是忽略以下顶级zip条目,即以:
开头的zip条目剩余zip条目的大小(不要忽略此zip条目中的任何文件夹)会告诉您内容的正确大小。 此方法也非常有效 - 您只读取zip文件的条目而不是zip文件本身,因此获取大小信息将以可忽略的时间和内存资源运行。为了快速入门,我能够在几分之一秒内获得4MB docx文件的大小。
下面粘贴使用此方法的“足够好”但没有充分工作的代码。请随意使用此作为起点并修复错误(如果找到)。如果您可以回复修改或更正以便其他人可以受益
,那将是非常好的 private static final void printUnzippedContentLength() throws IOException
{
ZipFile zf = new ZipFile(new File("/home/chaitra/verybigfile.docx"));
Enumeration<? extends ZipEntry> entries = zf.entries();
long sumBytes = 0L;
while(entries.hasMoreElements())
{
ZipEntry ze = entries.nextElement();
if(ze.getName().startsWith("docProps") || ze.getName().startsWith("_rels") || ze.getName().startsWith("[Content_Types].xml"))
{
continue;
}
sumBytes += ze.getSize();
}
System.out.println("Uncompressed content has size " + (sumBytes/1024) + " KB" );
}