Как сохранить файл, загруженный с помощью 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;
        }
            5 ответов
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();
просто для записи есть лучшие (более простые) способы сделать то же самое
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);
        }
    }
}
или с fluent API, если он нравится лучше
Request.Get("http://host/stuff").execute().saveContent(myFile);
вот простое решение с помощью 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();
}
вы также можете использовать Apache http client fluent API
Executor executor = Executor.newInstance().auth(new HttpHost(host), "user", "password"); 
executor.execute(Request.Get(url.toURI()).connectTimeout(1000)).saveContent("C:/temp/somefile");