【问题标题】:ZipOutputStream to networkZipOutputStream 到网络
【发布时间】:2017-10-26 13:49:09
【问题描述】:

我希望能够通过网络读取多个数据流并将文件写入网络并结合所有这些多个文件。

由于文件可能非常大,我不想做任何本地 IO 文件操作,而是对数据流进行操作。 从网络读取流,以 zip 格式将流写入网络。

我正在尝试下面的示例代码,但我没有看到远程主机上正在写入任何文件。 如果我使用FileInputStream,而不是通过网络写入,那么写入本地磁盘文件就可以了。

我想写什么给网络?

   InputStream input = new URL("http://www.cacr.caltech.edu/projects/danse/talks/kickoff/07-Butler/SANS_DANSEkickoffAug06.pdf").openStream();



    URL url = new URL("http://posttestserver.com/post.php?dir=ziptest");
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod("POST");
    connection.setDoOutput(true);
    connection.setDoInput(true);

    ZipOutputStream zipOutputStream = new ZipOutputStream(connection.getOutputStream());



   zipOutputStream.putNextEntry(new ZipEntry("1.pdf"));

    byte[] buffer = new byte[0xFFFF];



    for (int len; (len = input.read(buffer)) != -1;) {
        zipOutputStream.write(buffer, 0, len);
    }


    zipOutputStream.putNextEntry(new ZipEntry("2.pdf"));

    InputStream input1 = new URL("http://www.pdf995.com/samples/pdf.pdf").openStream();

    for (int len; (len = input1.read(buffer)) != -1;) {
        zipOutputStream.write(buffer, 0, len);
    }



    zipOutputStream.close();

    int responseCode = connection.getResponseCode();
    System.out.println("HTTP response code="+responseCode);

    connection.disconnect();

【问题讨论】:

  • 你没有打电话给ZipOutputStream.closeEntry()。在循环之后冲洗,而不是在它们内部。我可以在posttestserver.com/data/2017/10/26/ziptest 看到三个文件,但它们看起来有点短。
  • @EJP 如果需要,putNextEntry()close() 都会自动调用 closeEntry()。 --- 永远不需要flush()
  • @Andreas 同意,当然不在循环内。
  • @EJP :我删除了flush(),但结果与没有生成文件相同。
  • @NoviceUser 我没有说它会解决任何问题。冲洗内部循环只是不好的做法。你检查过我给你的链接中的任何文件吗?

标签: java performance networking optimization zip


【解决方案1】:

你没有做任何输入,所以实际上什么都没有发生。您至少需要获取 HTTP 响应代码:

int responseCode = connection.getResponseCode();
System.out.println("HTTP response code="+responseCode);

更好的是,酌情读取输入或错误流,然后将其关闭。

编辑您是否考虑过检查文件?这是我刚刚创建的一个:

Time: Thu, 26 Oct 17 05:36:04 +0000
Source ip: 107.23.92.82

Headers (Some may be inserted by server)
HTTP_ACCEPT_LANGUAGE = en
HTTP_HOST = posttestserver.com
HTTP_CONNECTION = Keep-Alive
HTTP_USER_AGENT = Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2b5) Gecko/20091204 Firefox/3.6b5
HTTP_ACCEPT_ENCODING = gzip,deflate
REMOTE_ADDR = 107.23.92.82
DOCUMENT_ROOT = /var/www/html
REQUEST_SCHEME = http
CONTEXT_PREFIX = 
CONTEXT_DOCUMENT_ROOT = /var/www/html
REMOTE_PORT = 52482
GATEWAY_INTERFACE = CGI/1.1
REQUEST_METHOD = GET
QUERY_STRING = dir=ziptest
REQUEST_URI = /post.php?dir=ziptest
PHP_SELF = /post.php
REQUEST_TIME_FLOAT = 1508996164.351
REQUEST_TIME = 1508996164

No Post Params.
Empty post body.

您需要将正文编写为名称-值配对参数,例如'压缩文件=.......'。任何人都猜测这将如何处理二进制数据。严格来说,您应该对数据进行 URL 编码。但真正需要什么取决于您的目标系统的行为方式。很可能您应该使用 PUT 而不是 POST。

【讨论】:

  • 获取响应代码为 200,但在 posttestserver.com/data/2017/10/26/ziptest 处仍然没有文件
  • 也许你达到了大小限制。试试更小的东西。
  • 我使用了小型 PDF,但仍然没有运气。
  • 查看编辑。我也成功了,只是设置了chunked transfer模式,不知道为什么。
  • 谢谢,这有帮助。我创建了本地基于 PHP 的上传服务器,并且代码有效。但是,运行大文件时出现 OOM 错误 java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3236) at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118) at
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
相关资源
最近更新 更多