6

特定のファイルを順番に読み取るために、ZipInputStream をリセット (開始位置に戻す) したいと考えています。それ、どうやったら出来るの?私はとても立ち往生しています...

      ZipEntry entry;
        ZipInputStream input = new ZipInputStream(fileStream);//item.getInputStream());

        int check =0;
        while(check!=2){

          entry = input.getNextEntry();
          if(entry.getName().toString().equals("newFile.csv")){
              check =1;
              InputStreamReader inputStreamReader = new InputStreamReader(input);
                reader = new CSVReader(inputStreamReader);
                //read files
                //reset ZipInputStream if file is read.
                }
                reader.close();
          }
            if(entry.getName().toString().equals("anotherFile.csv")){
              check =2;
              InputStreamReader inputStreamReader = new InputStreamReader(input);
                reader = new CSVReader(inputStreamReader);
                //read files
                //reset ZipInputStream if file is read.
                }
                reader.close();
          }

        }
4

5 に答える 5

5

可能であれば (つまり、読み取り対象のストリームだけでなく、実際のファイルがある場合)、より低レベルの ZipInputStream ではなく、 ZipFileクラスを使用してみてください。ZipFile は、ファイル内をジャンプして個々のエントリへのストリームを開く処理を行います。

ZipFile zip = new ZipFile(filename);
ZipEntry entry = zip.getEntry("newfile.csv");
if (entry != null){
    CSVReader data = new CSVReader(new InputStreamReader(
         zip.getInputStream(entry)));
} 
于 2010-10-12T06:45:52.980 に答える
2

次のように、InputStream を BufferedInputStream でラップし、メソッド mark() および reset() を呼び出すことができます。

BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
bufferedInputStream.mark(100);
ZipInputStream zipInputStream = new ZipInputStream(bufferedInputStream);

    any operation with zipInputStream ...

bufferedInputStream.reset();

mark メソッドに渡す readLimit は、inputStream で行うすべての読み取り操作をカバーするのに十分な大きさである必要があります。入力に含めることができる想定される最大ファイルサイズに設定すると、カバーされるはずです。

于 2018-10-29T14:40:59.510 に答える
1

同じ問題があります。BlobからInputStreamを取得していて、一時的な中間ファイルを使用したくないので、ZipInputStreamをリセットして、ZipInputStreamの同じオブジェクトからZipEntriesを再度読み取ります。あなたを助けるかもしれません。

ZipInputStream zis = new ZipInputStream(new BufferedInputStream(is));
ZipEntry ze = null;
Map<String, byte[]> fileEntries = new HashMap<String, byte[]>();

while ((ze = zis.getNextEntry()) != null) {

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];
    int count;

    while ((count = zis.read(buffer)) != -1) {
        baos.write(buffer, 0, count);
    }

    String filename = ze.getName();
    byte[] bytes = baos.toByteArray();                    
    fileEntries.put(filename, bytes);
}
//do what ever with the map of fileEntries

誰かが良い解決策を持っているなら共有してください、ありがとう

于 2012-04-19T07:19:39.687 に答える
0

これを試して。csv プロセッサを使用して、zip 内の各ファイルを処理します。私のシステムでは、入力ストリームは HTTP 接続からのストリームです。

// Get the files inside the zip.
ZipInputStream zin = new ZipInputStream(inputStream);
ZipEntry zentry;
while((zentry = zin.getNextEntry()) != null) {
    String fileName = zentry.getName();
    long fileLength = zentry.getSize();
    System.out.println("fileName:: " + fileName + ", " + fileLength);

    // csv parse it.
    int numLines = 0;
    CSVReader fileReader = new CSVReader(new InputStreamReader(zin));
    String[] nextLine;
    while ( (nextLine = fileReader.readNext()) != null) {
        numLines++;
    }
    zin.closeEntry();

    System.out.println("    number of lines: " + numLines);
}
zin.close();
于 2012-02-17T21:20:25.323 に答える