将ZipEntry数据写入字符串

Stu*_*ing 9 java android

我从一个zip文件中检索了一个zip条目.

InputStream input = params[0];
ZipInputStream zis = new ZipInputStream(input);

ZipEntry entry;
try {
    while ((entry = zis.getNextEntry())!= null) {

    }
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

这工作正常,它ZipEntry没有问题.

我的问题

如何将这些内容按ZipEntries原样xmlcsv文件一起放入String中.

Bla*_*elt 11

你必须阅读ZipInputStream:

StringBuilder s = new StringBuilder();
byte[] buffer = new byte[1024];
int read = 0;
ZipEntry entry;
while ((entry = zis.getNextEntry())!= null) {
      while ((read = zis.read(buffer, 0, 1024)) >= 0) {
           s.append(new String(buffer, 0, read));
      }
}
Run Code Online (Sandbox Code Playgroud)

当您退出内部时while保存StringBuilder内容,并重置它.

  • 这种方法会破坏两个字节或更多字节的 unicode 字符。 (2认同)

And*_*nko 5

使用定义的编码(例如UTF-8)并且不创建字符串:

import java.util.zip.ZipInputStream;
import java.util.zip.ZipEntry;
import java.io.ByteArrayOutputStream;
import static java.nio.charset.StandardCharsets.UTF_8;

try (
  ZipInputStream zis = new ZipInputStream(input, UTF_8); 
  ByteArrayOutputStream baos = new ByteArrayOutputStream()
) {
  byte[] buffer = new byte[1024];
  int read = 0;
  ZipEntry entry;
  while ((entry = zis.getNextEntry()) != null)
    while ((read = zis.read(buffer, 0, buffer.length)) > 0)
      baos.write(buffer, 0, read);
  String content = baos.toString(UTF_8.name());
}
Run Code Online (Sandbox Code Playgroud)