Как сохранить файл, загруженный с помощью HttpClient, в определенную папку
Я пытаюсь загрузить файл PDF с помощью HttpClient. Я могу получить файл, но я не уверен, как преобразовать байты в PDF файл и хранить его где-то в системе.
У меня есть следующий код: Как сохранить его как PDF?
public ???? getFile(String url) throws ClientProtocolException, IOException{
HttpGet httpget = new HttpGet(url);
HttpResponse response = httpClient.execute(httpget);
HttpEntity entity = response.getEntity();
if (entity != null) {
long len = entity.getContentLength();
InputStream inputStream = entity.getContent();
// How do I write it?
}
return null;
}
Ответы
Ответ 1
InputStream is = entity.getContent();
String filePath = "sample.txt";
FileOutputStream fos = new FileOutputStream(new File(filePath));
int inByte;
while((inByte = is.read()) != -1)
fos.write(inByte);
is.close();
fos.close();
EDIT:
вы также можете использовать BufferedOutputStream и BufferedInputStream для быстрой загрузки:
BufferedInputStream bis = new BufferedInputStream(entity.getContent());
String filePath = "sample.txt";
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(filePath)));
int inByte;
while((inByte = bis.read()) != -1) bos.write(inByte);
bis.close();
bos.close();
Ответ 2
Только для записи есть лучшие (более простые) способы сделать то же самое
File myFile = new File("mystuff.bin");
CloseableHttpClient client = HttpClients.createDefault();
try (CloseableHttpResponse response = client.execute(new HttpGet("http://host/stuff"))) {
HttpEntity entity = response.getEntity();
if (entity != null) {
try (FileOutputStream outstream = new FileOutputStream(myFile)) {
entity.writeTo(outstream);
}
}
}
Или с помощью свободного API, если ему это нравится лучше
Request.Get("http://host/stuff").execute().saveContent(myFile);
Ответ 3
Вот простое решение, использующее IOUtils.copy()
:
File targetFile = new File("foo.pdf");
if (entity != null) {
InputStream inputStream = entity.getContent();
OutputStream outputStream = new FileOutputStream(targetFile);
IOUtils.copy(inputStream, outputStream);
outputStream.close();
}
return targetFile;
IOUtils.copy()
отлично, потому что он обрабатывает буферизацию. Однако это решение не очень масштабируемо:
- вы не можете указать имя и каталог целевого файла
- вы можете захотеть сохранить файлы по-другому, например. в базе данных. В этом случае файлы не нужны.
Гораздо более масштабируемое решение включает в себя две функции:
public void downloadFile(String url, OutputStream target) throws ClientProtocolException, IOException{
//...
if (entity != null) {
//...
InputStream inputStream = entity.getContent();
IOUtils.copy(inputStream, target);
}
}
И вспомогательный метод:
public void downloadAndSaveToFile(String url, File targetFile) {
OutputStream outputStream = new FileOutputStream(targetFile);
downloadFile(url, outputStream);
outputStream.close();
}
Ответ 4
Откройте FileOutputStream
и сохраните байты от inputStream
до него.