Java 无法使用ZipInputStream处理zip文件中的大文件
我有一个下面提到的java类,它提取一个zip,然后一个接一个地将其内容转换为字符串并打印到控制台。Java 无法使用ZipInputStream处理zip文件中的大文件,java,zip,Java,Zip,我有一个下面提到的java类,它提取一个zip,然后一个接一个地将其内容转换为字符串并打印到控制台。 问题是,当zip中的文件大到80KB时。未显示整个内容(只有3/4的数据转换为字符串并显示在控制台中)。 其次,下面提到的代码在中间引入空/空格,如果文件大小很小~1KB,也会引入空/空格 下面提到的代码中有什么错误 public static void main(String[] args) throws Exception { byte[] buf = new byte[1024]
问题是,当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();
}
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();
}