找到文件内容大小docx,pptx等

时间:2013-11-27 07:23:14

标签: file file-io apache-poi docx xlsx

我想找出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);

如果还有其他更好的方法可以帮助我。

1 个答案:

答案 0 :(得分:0)

好的,这已经很久以前被问过,而且这个问题也没有回应。我没有使用OPCPackage,因此我的答案不是基于此。

DOCX(以及PPTX和XSLX)文件都是具有特定结构的zip文件。 因此,我们可以使用 java.util.zip 包并枚举zip文件的条目,并获取xlsx文件和字的zip条目 xl 的大小用于docx文件。可能更通用的方法是忽略以下顶级zip条目,即以:

开头的zip条目
  1. docProps
  2. _rels
  3. [CONTENT_TYPES]的.xml
  4. 剩余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" );
     }