繁体   English   中英

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

[英]Write a binary downloaded file to disk in Java

我有一个允许在允许使用 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。

不要使用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();
}

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

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

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

is = urlConnect.getInputStream();

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

只需阅读有关 LimitInputStream 的信息,它听起来就像您正在做的那样,缓冲输入流以提高效率。

你甚至可以使用 NIO FileChannel#transferFrom 方法。

            URL website = new URL(urlToDownload);

            try (ReadableByteChannel rbc = Channels.newChannel(website.openStream());
                    FileOutputStream fos = new FileOutputStream(filePath);) {
                fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
            }

参考链接1链接2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM