2016-05-11 20 views
0

java.io.Fileをjava.util.zip.ZipFileにコピーするメソッドを作成しようとしています。このためには、最初にZipFileのjava.util.zip.ZipOutputStreamを開き、ファイルの名前で新しいjava.util.zip.ZipEntryを作成し、その新しいZipEntryをZipOutputStreamに入れ、Fileの内容を書き込みますZipOutputStreamに渡します。その後、私はZipOutputStreamをフラッシュし、すべてのストリームを閉じます。Java - 新しいZipEntryを追加するときにZipEntriesが削除される

何らかの理由で、私はこの手順でZipFileから他のすべてのZipEntriesを削除し、そこにコピーされたものだけを残すことは説明できません。ここでは、ファイルをコピーするためのコード(ファイルはjava.io.InputStreamをパラメータによって表される)

public static boolean compress(final InputStream pSourceStream, final ZipFile pTarget, final ZipEntry pContainer, 
     final String pFileName) { 
    if (pSourceStream != null && pTarget != null && pFileName != null && !pFileName.isEmpty()) { 
     try { 
      final ZipOutputStream output = new ZipOutputStream(new FileOutputStream(new File(pTarget.getName()))); 
      final ZipEntry target = (pContainer != null) ? new ZipEntry(pContainer.getName() + pFileName) 
        : new ZipEntry(pFileName); 
      output.putNextEntry(target); 

      final byte[] buffer = new byte[BUFFER_SIZE]; 
      int readBytes; 

      while ((readBytes = pSourceStream.read(buffer)) != -1) { 
       output.write(buffer, 0, readBytes); 
      } 
      pSourceStream.close(); 
      output.flush(); 
      output.close(); 
      return true; 
     } catch (final IOException ignore) { 
      // took care of target 
      // ios will return false 
     } 

    } 
    return false; 
} 

ここではそうbasiclyここで何をやってイム

public static void main(final String[] args) throws ZipException, IOException { 
    final Package p = FileHandler.class.getPackage(); 
    final InputStream classStream = FileHandler.stream(p, "FileHandler.class"); 

    FileHandler.compress(classStream, new ZipFile(new File("C:/Users/litts/Desktop/FileHandlerTest/TestZip.jar")), 
      "FileHandler1.class"); 

} 

このメソッドを呼び出して、私のコードがあるですFileHandlerのクラスファイルをzipファイルにコピーしています。しかし、他のすべてのコンテンツは削除されます。

答えて

1

あなたはZipファイルを読んでいないので、ファイルレベルで上書きしています。

+0

は、新たなエントリが作成され、ストリームはその焦点を当てていることを、言います1。私はそれが自動的にすべての古いデータを削除するとは思わなかった。つまり、既存のすべてのデータを新しい出力ストリームにコピーする必要がありますか? 「ファイルレベル」はどういう意味ですか?聞いたことはありません。 idkの多くについては、どちらかのアーカイブについてのいずれか – Basti

+0

私は古いコンテンツをRAMにコピーして、一度に読み込んでいます。新しいエントリと一緒にコピーしました。今働いている。手がかりをありがとう – Basti

+0

Zipファイルを読むためには、ある種のInputStreamが必要です。 – Lee

0

ファイルをZIPファイルにコピーするNIO.2ファイルAPIを使用する方がずっと簡単です。

てみてください(未テスト):私はそれが現在のcontentsinceに方法putNextEntry(...)のドキュメントをattatchすることが期待

try (FileSystem zipFS = FileSystems.newFileSystem(URI.create("jar:" + zipURI), Collections.<String, Object>emptyMap())) { 
    Path targetInZipPath = zipFS.getPath(targetInZipPathString); 

    Files.copy(srcPath, targetInZipPath); 
} 
関連する問題