2017-07-27 24 views
0

オンザフライで作成され、ファイルシステムに永続性のないファイルで構成されるZIPファイルを作成する必要があります。メモリ内にZIPファイルを作成する

例:メモリにSQLiteデータベースを作成し、それにデータを入力した後、それをまだ存在しないZIPファイルに追加したいのですが、実際にこのZIPファイルをファイルシステムに書きたいのですが。

アーカイブの内容となるファイルをファイルシステムから読み取る必要があるいくつかのアプローチが見つかりました。

私がやりたいことを実際にアーカイブする方法はありますか?私はcompress-commonsが私を助けることを望んだが、明らかにそうではないと思った。

私は何か不足していますか?

+1

書籍、ツール、ソフトウェアライブラリ、チュートリアル、その他のオフサイトリソースをお勧めするか、見つけようとする質問は、オピニオン回答と迷惑メールを引き付ける傾向があるため、スタックオーバーフローに関するトピックです。代わりに、問題を説明し、それを解決するためにこれまでに何が行われているかを記述します。 – JFPicard

+0

一時フォルダを作成し、ファイルを保存し、圧縮して、操作後に削除することができます。 – Lino

答えて

1

ジップしようとしているメモリ内オブジェクトがシリアライズ可能な場合は、これは非常に簡単です。

任意のシリアライズ可能なインスタンスを取得し、byte[]に設定することができます。私はこれを行うためのユーティリティメソッドがあります。

public static byte[] convertToBytes(Object object) throws IOException { 
    try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
      ObjectOutput out = new ObjectOutputStream(bos)) { 
     out.writeObject(object); 
     out.flush(); 
     return bos.toByteArray(); 
    } 
} 

あなたはバイト単位で表され、そのオブジェクトを持っていたら、あなたはそれを圧縮するZipOutputStreamを使用することができます。

try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     GZIPOutputStream out = new GZIPOutputStream(bos);) { 
    out.write(bytes); 
    out.finish(); 
    byte[] compressed = bos.toByteArray(); // this is my compressed data 
} 

(私は単純化のためにここにGzipを使用しますたとえば、複数のエントリを持つzipを作成することもできます)。

+0

ありがとうございました!このアプローチでは、異なるフォルダに複数のファイルを置くことは可能ですか?私は、ファイルの一部が暗号化され、ファイルシステムにファイルの暗号化されていないバージョンがあってはならないという事実のために、メモリ内の解決策が必要です。 – Hannes

+0

ディレクトリ構造がzip内にあることを意味する場合は、[ZipOutputStream](https://docs.oracle.com/javase/8/docs/api/index.html?java)を使用すると可能です/util/zip/ZipOutputStream.html)を適切なZipEntryオブジェクトで置き換えます。 –

関連する問題