相关疑难解决方法(0)

814
推荐指数
15
解决办法
90万
查看次数

压缩InputStream,返回InputStream(在内存中,没有文件)

我试图压缩一个InputStream并返回一个InputStream:

public InputStream compress (InputStream in){
  // Read "in" and write to ZipOutputStream
  // Convert ZipOutputStream into InputStream and return
}
Run Code Online (Sandbox Code Playgroud)

我正在压缩一个文件(所以我可以使用GZIP),但将来会做更多的事情(所以我选择了ZIP).在大多数地方:

我的问题是:

  1. 如果不存在这样的方法,如何将ZipOutPutStream转换为InputStream?

  2. 创建ZipOutPutStream()时,没有默认构造函数.我应该创建一个新的ZipOutputStrem(new OutputStream())??

java zip

10
推荐指数
2
解决办法
9340
查看次数

Java从ZipInputStream条目创建InputStream

我想编写一个方法,从单个InputStream读取ZIP中的几个XML文件.

该方法将打开ZipInputStream,并在每个xml文件上获取相应的InputStream,并将其提供给我的XML解析器.这是方法的骨架:

private void readZip(InputStream is) throws IOException {

    ZipInputStream zis = new ZipInputStream(is);
    ZipEntry entry = zis.getNextEntry();

    while (entry != null) {

        if (entry.getName().endsWith(".xml")) {

            // READ THE STREAM
        }
        entry = zis.getNextEntry();
    }
}
Run Code Online (Sandbox Code Playgroud)

有问题的部分是"// READ THE STREAM".我有一个工作解决方案,它包括创建一个ByteArrayInputStream,并用它提供我的解析器.但它使用缓冲区,对于大文件,我得到一个OutOfMemoryError.这是代码,如果有人仍然感兴趣:

int count;
byte buffer[] = new byte[2048];
ByteArrayOutputStream out = new ByteArrayOutputStream();
while ((count = zis.read(buffer)) != -1) { out.write(buffer, 0, count); }       
InputStream is = new ByteArrayInputStream(out.toByteArray());
Run Code Online (Sandbox Code Playgroud)

理想的解决方案是使用原始ZipInputStream提供解析器.它应该有效,因为如果我只用扫描仪打印条目内容就可以了:

Scanner sc = new Scanner(zis);
while (sc.hasNextLine())
{
    System.out.println(sc.nextLine());
}
Run Code Online (Sandbox Code Playgroud)

但是......我正在使用的解析器(jdom2,但我也尝试使用javax.xml.parsers.DocumentBuilderFactory)在解析数据后关闭流:/.所以我无法获得下一个条目并继续. …

java zipinputstream xml-parsing

5
推荐指数
2
解决办法
4014
查看次数

标签 统计

java ×3

bytearray ×1

inputstream ×1

xml-parsing ×1

zip ×1

zipinputstream ×1