代码之家  ›  专栏  ›  技术社区  ›  radius

用Java将二进制下载文件写入磁盘

  •  7
  • radius  · 技术社区  · 16 年前

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

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

    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。

    4 回复  |  直到 16 年前
        1
  •  33
  •   Jon Skeet    13 年前

    不要用铅笔 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();
    }
    
        2
  •  9
  •   Tom    14 年前

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

        3
  •  2
  •   Powerlord    16 年前

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

    它也是多余的,就像 urlConnect.getInputStream(); 已返回InputStream,并且所有InputStreams都支持read()。

    is = urlConnect.getInputStream();
    

    is bis 都是相同的变量。否则,您将读取循环中的错误流。

        4
  •  0
  •   Ben    14 年前

    只需阅读LimitInputStream,它听起来就像您正在做的一样,缓冲输入流以获得更高的效率。

    推荐文章