【问题标题】:How to serve ZipOutputStream to network in JAVA如何在 JAVA 中将 ZipOutputStream 服务到网络
【发布时间】:2016-04-21 08:43:26
【问题描述】:

我正在JAVA 中编写一个服务器,客户端请求下载多个文件,服务器将创建一个ZipOutputStream 并立即提供服务。另一方面,另一个线程将写入ZipOutputStream。我用piped input/output stream

代码

PipedInputStream in = new PipedInputStream();
PipedOutputStream out = new PipedOutputStream();
in.connect(out);
ZipOutputStream zout = new ZipOutputStream(out);
new Thread{
  public void run(){
       while(condition){
           more logic.. 
           zout.write(data,0,length);
           zout.flush()
       }
       zout.close();
       out.close();
  }
}.start();
return in;

但是当我单击下载按钮时,它会下载(立即完成)一个小文件(已损坏),而我的 zip 创建作业仍在运行。如何同步这两个作业?

【问题讨论】:

  • Vaiya,你写完后刷脸了吗?
  • 我没有,但是flush也不起作用。
  • 您是否在线程写入 zout 完成之前关闭 PipedOutputstream?
  • 不,它在 zout 之后关闭。
  • 为什么是线程? PipedOutputStream 和朋友的基本用途很少,这似乎不是其中之一。只需将ZipOutputStream 包裹在响应输出流周围,然后在当前线程中完成。

标签: java zipinputstream


【解决方案1】:

您应该flush 然后关闭ZipOutputStream。并更好地使用ZipEntry 创建存档

    ZipOutputStream zout = new ZipOutputStream(out);
    new Thread {
        public void run () {
            while (condition) {
                // logic ...
                zipEntry = new ZipEntry("name");
                zout.putNextEntry(zipEntry);
                zout.write(data);
                zout.flush();
                zout.closeEntry();
            }
            zout.flush();
            zout.close();
        }
    }.start();

    return in;

【讨论】:

  • 我的代码完全一样。我第一次没有使用 flush 和 closeEntry 方法。但使用这些方法也无济于事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 2020-09-08
  • 1970-01-01
相关资源
最近更新 更多