【问题标题】:Write a binary downloaded file to disk in Java用Java将下载的二进制文件写入磁盘
【发布时间】:2010-12-01 10:14:40
【问题描述】:

我有一个允许在允许使用 Java 函数的 javascript 文件 (.js) 中编写附加组件的软件(我不知道这是否常见,我之前从未在 javascript 文件中看到 java 调用)

我需要从网络服务器下载一个二进制文件并将其写入硬盘。我尝试了以下代码:

baseencoder = new org.apache.commons.codec.binary.Base64();
url = new java.net.URL("https://server/file.tgz");

urlConnect = url.openConnection();
urlConnect.setDoInput(true);
urlConnect.setDoOutput(true);
urlConnect.setRequestProperty("authorization","Basic "+ java.lang.String(baseencoder.encodeBase64(java.lang.String( username + ":" + password ).getBytes())));
urlConnect.setRequestProperty("content-type","application/x-www-form-urlencoded");

is = new java.io.DataInputStream(urlConnect.getInputStream());
fstream = new FileWriter("C:\\tmp\\test.tgz");
out = new BufferedWriter(fstream);
while((data = is.read()) != -1){
    out.write(data);
}

out.close();
is.close();

生成的文件不再是有效的 gzip 存档。如果我犯了一个巨大的错误,我很抱歉,但我不是程序员,也不太了解 Java。

【问题讨论】:

    标签: java inputstream outputstream


    【解决方案1】:

    不要使用FileWriter - 它试图将数据转换为文本。

    只需使用FileOutputStream

    byte[] buffer = new byte[8 * 1024];
    
    InputStream input = urlConnect.getInputStream();
    try {
      OutputStream output = new FileOutputStream(filename);
      try {
        int bytesRead;
        while ((bytesRead = input.read(buffer)) != -1) {
          output.write(buffer, 0, bytesRead);
        }
      } finally {
        output.close();
      }
    } finally {
      input.close();
    }
    

    【讨论】:

    • 另外,您需要在 while 循环中使用正确的测试条件:while((data = is.read()) != null){ .. . }.
    • 感谢使用 FileOutputStream 工作(我仍然只使用一个简单的 read() 因为它似乎不可能在 javascript 中使用字节缓冲区,因为它不是一个对象。
    【解决方案2】:

    DataInputStream 用于读取 Java 原语,而不是用于通用数据。

    这也是多余的,因为urlConnect.getInputStream(); 已经返回了一个 InputStream,并且所有 InputStreams 都支持 read()。

    is = urlConnect.getInputStream();
    

    附:这是假设 isbis 是同一个变量。否则,您将在循环中读取错误的流。

    【讨论】:

    • 不错的信息!有趣的是,尽管命名表明 DataInputStream 不适用于通用数据..!
    【解决方案3】:

    我知道这个问题已经回答了,但是更简单的方法是使用 Apache Commons IO 的IOUtils.copy() 方法,它可以将InputStream 完全复制到OutputStream

    【讨论】:

      【解决方案4】:

      刚刚了解 LimitInputStream 听起来就像你正在做的那样,缓冲输入流以提高效率。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-15
        • 2012-11-01
        • 2010-11-29
        • 1970-01-01
        • 2015-09-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多