43

HttpClient で PDF ファイルをダウンロードしようとしています。ファイルを取得することはできますが、バイトを 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;
        }
4

7 に答える 7

48
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();

編集:

ダウンロードを高速化するためにBufferedOutputStreamBufferedInputStreamを使用することもできます。

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();
于 2012-06-09T11:04:35.227 に答える
45

記録のために、同じことを行うためのより良い(より簡単な)方法があります

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);
于 2015-08-18T09:22:13.457 に答える
25

を使用した簡単なソリューションを次に示します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()バッファリングを処理するため、優れています。ただし、このソリューションはあまりスケーラブルではありません。

  • ターゲットファイル名とディレクトリを指定できません
  • データベースなど、別の方法でファイルを保存したい場合があります。このシナリオでは、ファイルは必要ありません。

はるかにスケーラブルなソリューションには、次の 2 つの機能が含まれます。

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();
}
于 2012-06-09T11:05:08.943 に答える
1

aを開き、FileOutputStreamそこからのバイトを保存しますinputStream

于 2012-06-09T11:04:19.097 に答える