0

私は、zipを抽出し、その内容を文字列に変換してコンソールに出力する以下のJavaクラスを持っています。
問題は、zip 内に存在するファイルが最大 80KB の場合です。コンテンツ全体が表示されません (データの 3/4 のみが文字列に変換され、コンソールに表示されます)。
次に、以下のコードはヌル/スペースを間に導入しています。また、ファイルサイズが小さい場合は ~1KB です。

以下のコードで何が間違っていますか。

 public static void main(String[] args) throws Exception {
    byte[] buf = new byte[1024];
    final int BUFFER = 1024;
    String fName = "c:\\DOC00001.zip";
    ZipInputStream zinstream = new ZipInputStream(
            new FileInputStream(fName));
    ZipEntry zentry = zinstream.getNextEntry();

    while (zentry != null) {            
    byte data[] = new byte[BUFFER];
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    while ((zinstream.read(data, 0, BUFFER)) != -1) {
        out.write(data);
    }       
    InputStream is = new ByteArrayInputStream(out.toByteArray());
    StringWriter writer = new StringWriter();
    IOUtils.copy(is, writer, "UTF-8");
    String response = writer.toString();
    System.out.println(response);
    zentry = zinstream.getNextEntry();
    }
    zinstream.close();
}
4

1 に答える 1

0

このreadメソッドは、完全なバッファーを読み取ることが保証されていません。読み取られたバイト数が返されます。zip ファイルまたはInputStream一般的なファイルからデータを抽出する正しい方法は次のとおりです。

byte[] data = new byte[BUFFER];
ByteArrayOutputStream out = new ByteArrayOutputStream();
int bytesRead;
while ((bytesRead = zinstream.read(data, 0, BUFFER)) != -1) {
    out.write(data, 0, bytesRead);
}

または、すでに を使用しているためIOUtils

ByteArrayOutputStream out = new ByteArrayOutputStream();
IOUtils.copy(zinstream, out);

または、後で文字列に書き込むためだけに書き込む場合は、完全にByteArrayOutputStreamスキップできます。ByteArrayOutputStream

while (zentry != null) {
  StringWriter writer = new StringWriter();
  IOUtils.copy(zinstream, writer, "UTF-8");
  String response = writer.toString();
  System.out.println(response);
  zentry = zinstream.getNextEntry();
}
于 2013-03-26T12:04:33.243 に答える