2016-06-21 9 views
3

通常のPDFファイルのバイトをJavaの「読み取り」機能を使用してバイト配列に読み込もうとすると、バイト配列は元のPDFファイルと同じサイズで正しく読み込まれます。Javaの圧縮PDFファイルからバイトを読み取る

Path file_path = Paths.get("D:\\Zip Test Client", "vadClient1.pdf"); 
    byte[] ByteArray= Files.readAllBytes(file_path); 
    FileOutputStream fos = new FileOutputStream(new File("E:\\newFinalPDF.pdf")); 

しかし、私はzip形式のフォルダ内に同じPDFファイルからバイトを読んだとき、読み取り機能のみが8843バイトを読み込み、(元のサイズが194471である)と、すべてが0

zipFile = new ZipFile(new File("D:\\Zip test Server\\ZipTestFolderOnServer.zip")); 
     long count = zipFile.size(); 
     Enumeration<? extends ZipEntry> entries = zipFile.entries(); 
     while(entries.hasMoreElements()){ 

      System.out.println("New File starting"); 
      ZipEntry zipEntry = entries.nextElement(); 
      System.out.println(zipEntry.getName()); 
      InputStream fis = zipFile.getInputStream(zipEntry); 
      byte[] fileToBytes = new byte[(int)zipEntry.getSize()]; 


      FileOutputStream fos = new FileOutputStream(new File("E:\\ContentZipped_" + zipEntry.getName())); 
      fis.read(fileToBytes); 
      fos.write(fileToBytes); 
      fis.close(); 
      Thread.sleep(1000); 
      --count; 
     } 

何で休みますこの行動の説明ですか?

編集1: - 私はTikaやPOIなどのサードパーティの統合を探していません。

+0

これらのテストファイルは、どのようにPDFとなるのでしょうか? – usr2564301

+1

あなたは 'InputStream.read'を呼び出して戻り値を無視しています。あなたは' read'への一回の呼び出しですべてのデータを読むことができると思われます。それは悪い仮定です。 –

+0

@RadLexus .png、.xml、.doc、.txtは同じzipフォルダにあり、すべて正常な動作をしています。 –

答えて

0

パブリッククラスSampleZipExtract {

public static void main(String[] args) { 

    List<String> tempString = new ArrayList<String>(); 
    StringBuffer sbf = new StringBuffer(); 

    File file = new File("C:\\Users\\xxx\\Desktop\\abc.zip"); 
    InputStream input; 
    try { 

     input = new FileInputStream(file); 
     ZipInputStream zip = new ZipInputStream(input); 
     ZipEntry entry = zip.getNextEntry(); 

     BodyContentHandler textHandler = new BodyContentHandler(); 
     Metadata metadata = new Metadata(); 

     Parser parser = new AutoDetectParser(); 

     while (entry!= null){ 

      if(entry.getName().endsWith(".txt") || 
         entry.getName().endsWith(".pdf")|| 
         entry.getName().endsWith(".docx")){ 
      System.out.println("entry=" + entry.getName() + " " + entry.getSize()); 
       parser.parse(input, textHandler, metadata, new ParseContext()); 
       tempString.add(textHandler.toString()); 
      } 
     } 
     zip.close(); 
     input.close(); 

     for (String text : tempString) { 
     System.out.println("Apache Tika - Converted input string : " + text); 
     sbf.append(text); 
     System.out.println("Final text from all the three files " + sbf.toString()); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SAXException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (TikaException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

}

+0

答えをありがとう。しかし、私はサードパーティのAPIを探しているわけではありません。私はOPを編集する –

2

のは、それがよりエラーコードを簡素化することによって発生しやすい(と少ないメモリ消費する)、あなたのzipエントリの内容をコピーするためにこれを使用してみましょう:

try (InputStream fis = zipFile.getInputStream(zipEntry)) { 
    Files.copy(fis, Paths.get("E:\\ContentZipped_" + zipEntry.getName())); 
} 
関連する問題