5

摘要:拥有包含的字节图像,我怎样才能获得一个干净且正确的阅读器,它返回文本文件的行?a.zipa.txt

我确实将 zip 文件的图像从 Web 服务下载到byte[] content. 我想写一个方法

private BufferedReader contentToBufferedReader(byte[] content)

这将返回一个可以像这样使用的阅读器

reader = contentToBufferedReader(content);
while ((line = reader.readLine()) != null) {
    processThe(line);
}
reader.close()

到目前为止,我已经(更新

private BufferedReader contentToBufferedReader(byte[] content) {

    ByteArrayInputStream bais = new ByteArrayInputStream(content);
    ZipInputStream zipStream = new ZipInputStream(bais);
    BufferedReader reader = null;

    try {
        ZipEntry entry = zipStream.getNextEntry();

        // I need only the first (and the only) entry from the zip file.
        if (entry != null) {
            reader = new BufferedReader(new InputStreamReader(zipStream, "UTF-8"));
            System.out.println("contentToBufferedReader(): success");
        }
    }
    catch (IOException e) {
        System.out.println("contentToBufferedReader(): failed...");
        System.out.println(e.getMessage());
    }

    return reader;
}

我不确定当出现故障时如何关闭所有流对象。reader此外,如果成功返回、使用和关闭,我不确定如何关闭它们。

4

2 回答 2

1

这将一次性获取所有字节(为方便起见,使用 guava ByteStreams)

ZipEntry entry = zipStream.getNextEntry();
while (entry != null) {
  if (!entry.isDirectory()) {
    String filename = entry.getName();//this includes the path!
    byte[] data = ByteStreams.toByteArray(zipStream);
    //do something with the bytes 
  }
  entry = zipIn.getNextEntry();
}

你可以得到这样的读者:

InputStreamReader reader = new InputStreamReader(new ByteArrayInputStream(data)));

当您调用 zipStream.getNextEntry() 时,zipStream 会前进。我还认为流不支持标记和重置 iirc,这意味着您只能读取一次(因此在将其传递给可能需要随机访问的其他处理之前立即全部读取)

于 2013-10-08T11:06:49.963 回答
1

检查此主题,您可能需要先解压缩文件,然后才能阅读它。

什么是压缩/解压缩文件的好 Java 库?

于 2013-10-08T11:03:10.007 回答