2013-02-08 9 views
5

ex.zipのような名前のファイルがあります。この例では、Zipファイルには同じ名前のファイル(ex.txt)が1つだけ含まれています。私は毎回zipファイルを抽出したくありません。私は、zipファイルを抽出せずにファイル(ex.txt)の内容を読む必要があります。私は以下のようないくつかのコードを試してみましたが、私は変数内のファイルの名前だけを読むことができます。Javaで抽出せずにZippedファイルの内容を読み取る方法

ファイルの内容を読み込んで変数に格納するにはどうすればよいですか?

は、あなたの考えは、それはバイト配列にあるとしてzipファイルを読み込み、変数に格納することである

fis=new FileInputStream("C:/Documents and Settings/satheesh/Desktop/ex.zip"); 
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis)); 
ZipEntry entry; 

while((entry = zis.getNextEntry()) != null) { 
    i=i+1; 
    System.out.println(entry); 
    System.out.println(i); 
    //read from zis until available 
} 
+1

、あなたの質問は非常に明確ではありません。 ZIPからファイルを抽出するかどうかを指定しますか? *あなたは何を解決しようとしていますか? – parsifal

+0

Bye way:Navigation Sytemsは同じ方法で、デジタル道路地図データをメインメモリに圧縮して保存し、必要に応じて部品を解凍します。 – AlexWien

答えて

5

事前にありがとうございます。 後で、zipファイルを必要なときにメモリを節約する、オンデマンドでそれを抽出します。あなたは、Java 1.7を使用している場合

まずバイト配列にzipFileBytes

をZipファイルの内容をお読みください。

Path path = Paths.get("path/to/file"); 
byte[] zipFileBytes= Files.readAllBytes(path); 

そうでない場合は、あなたのジップ今

byte[] zipFileBytes; 
zipFileBytes = IOUtils.toByteArray(InputStream input); 

libにAppache.commonsを使用ファイルは圧縮された形式の変数zipFileBytesに格納されます。

次にあなたが

ByteArrayInputStream bis = new ByteArrayInputStream(zipFileBytes)); 
ZipInputStream zis = new ZipInputStream(bis); 
4

何かの使用を抽出するために必要がある場合は、このお試しください:ファイルにテキストが含まれている、とあなたは文字列としてそれを印刷したい、できれば、例えば

 ZipFile fis = new ZipFile("ex.zip"); 

     int i = 0; 
     for (Enumeration e = zip.entries(); e.hasMoreElements();) { 
      ZipEntry entry = (ZipEntry) e.nextElement(); 
      System.out.println(entry); 
      System.out.println(i); 

      InputStream in = fis.getInputStream(entry); 

     } 

を次のようにInputStreamを読んでください:Read/convert an InputStream to a String

2

あなたのケースでは、zipファイルは多くのファイルを保持できるコンテナなのであなたがそれを開くたびに右のファイルに)は、それぞれのzipファイルに1つのテキストファイルしか含まれていないことを真剣に物事を複雑にします。多分、テキストファイルをgzipするほうがずっと簡単です(gzipはコンテナではなく、データの圧縮されたバージョンです)。そして、それは使用することは非常に簡単です:

GZIPInputStream gis = new GZIPInputStream(new FileInputStream("file.txt.gz")); 
// and a BufferedReader on top to comfortably read the file 
BufferedReader in = new BufferedReader(new InputStreamReader(gis)); 

それらを生産することも同様に簡単です:書かれたよう

GZIPOutputStream gos = new GZIPOutputStream(new FileOutputStream("file.txt.gz")); 
+0

これは答えではないので、圧縮形式のzipを変数に入れたいと思っています。引用:私はディスク上で毎回zipファイルを抽出し、そのデータを読み取ることを望まない。 – AlexWien

+0

@AlexWienそうではなく、コンテンツを(バイト単位で、または行単位で)表示することができます** **ファイル全体を一度に拡張することができました。それがOPが後になったことです。私は単に、zipファイルよりも扱いやすいファイルを圧縮する代わりの方法を指摘したかっただけです。 zipファイルを変数imoに格納することは、実用的なアプリケーションではありません。 – fvu

+0

彼が望んでいたかどうかは不明ですが、おそらく彼はあなたの解決策を望んでいたかもしれません。ディスク上に新しいファイルを作成してwhitoutを解凍してください。ファイルから読み込むよりもバイト配列から解凍する方法は、それほど魅力的ではありません:100回目の解凍をしなければならないと想像してください。ディスクへのアクセスでは、埋め込みデバイスではできません。低キャッシュ。多くのアプリケーションがあります。たとえば、車両が走行していたトラックを計算するマップマッチングシステムです。大きな国の2つ:ディスクからの読み取りは遅くなります – AlexWien

関連する問題