我有一个允许在javascript文件(.js)中编写附加组件的软件,允许使用Java函数(我不知道这是否常见,我以前从未在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。
答案 0 :(得分:33)
不要使用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();
}
答案 1 :(得分:9)
我知道这个问题已经得到解答,但更简单的方法是使用Apache Commons IO的IOUtils.copy()
方法,该方法可以将InputStream
完全复制到OutputStream
。
答案 2 :(得分:2)
DataInputStream
用于读取Java基元,而不是用于通用数据。
它也是多余的,因为urlConnect.getInputStream();
已经返回一个InputStream,并且所有InputStream都支持read()。
is = urlConnect.getInputStream();
P.S。这假设is
和bis
是相同的变量。否则,您正在循环中读取错误的流。
答案 3 :(得分:0)
只需阅读有关LimitInputStream的声音,就像它正在执行的操作一样,缓冲输入流以提高效率。