我正在使用如下所示:
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(targerFile);
HttpResponse response = httpclient.execute(httpGet);
// get the response body as an array of bytes
HttpEntity entity = response.getEntity();
// write for the destination file
InputStream instream = null;
if (entity != null) {
instream = entity.getContent();
ByteArrayOutputStream bytOut = new ByteArrayOutputStream();
int x;
do {
x = instream.read();
if (x != -1) {
bytOut.write(x);
instream.close();
bytOut.close();
}
} while (x != -1);
FileOutputStream fout = new FileOutputStream(destinationFile);
fout.write(bytOut.toByteArray());
fout.close();
但只有在那时我才发现来自httpclient的输入流已关闭。所以我无法多次阅读它。这有什么工作吗?或者这不是正确的方法吗?
答案 0 :(得分:4)
使用org.apache.http.util.EntityUtils:
byte[] data = EntityUtils.toByteArray(response.getEntity());
httpClient.getConnectionManager().shutdown();
将该bytearray写入来自commons-io:
的FileUtils文件FileUtils.writeByteArrayToFile(destinationFile, data);
答案 1 :(得分:2)
不要关闭循环内的流。在读取整个输入流之后在循环外执行此操作。
答案 2 :(得分:0)
在我看来,就像你在读取1个字节后关闭你的bytOut流一样。但我会做这样的事情:
String line;
BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent()));
PrintWriter pw = new PrintWriter(new FileOutputStream(destinationFile));
while ((line = reader.readLine()) != null) pw.println(line);
pw.close();
reader.close();
答案 3 :(得分:0)
首先,您的问题是您在读取第一个字节后关闭循环中的输入流。不要那样做。
其次,如果您要做的只是将其写入ByteArrayOutputStream
,那么写FileOutputStream
是没有意义的。直接写入文件。
第三,使用byte[]
和BufferedInputStream
以及BufferedOutputStream
,这样您就可以一次读取更多字节。
第四,忽略上述内容,只使用commons-io。