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

用Java将二进制下载文件写入磁盘,java,inputstream,outputstream,Java,Inputstream,Outputstream,我有一个软件,允许在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.o

我有一个软件,允许在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。

不要使用a-这是试图将数据转换为文本

只需使用
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();
}

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

它也是冗余的,如
urlConnect.getInputStream()
已返回InputStream,并且所有InputStreams都支持read()


注意:这是假设
is
bis
是相同的变量。否则,您在循环中读取了错误的流。

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

只要读一下LimitInputStream,它听起来就像你正在做的一样,缓冲输入流以提高效率。

此外,你还需要在while循环中使用正确的测试条件:while((data=is.read())!=null){…}。感谢使用FileOutputStream(我仍然只使用一个简单的read(),因为它似乎不可能在javascript中使用字节缓冲区,因为它不是一个对象。很好的信息!有趣的是了解到,尽管命名建议DataInputStream不适用于一般数据。。!
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();
}