ファイルが特定のコンテンツ タイプである場合、URL からファイルをダウンロードしようとしています。URL は html ページまたは pdf ページのいずれかを提供できますが、pdf ファイルのみを保存したいと考えています。これを行う私の試みは以下のとおりです。
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("HEAD");
connection.connect();
String contentType = connection.getContentType();
if (contentType.equals("application/pdf")) {
org.apache.commons.io.FileUtils.copyURLToFile(url, file);
}
contentType は正しく取得されていますが、呼び出しcopyURLToFile(url,file);
により次の例外が発生します。
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at com.sun.net.ssl.internal.ssl.InputRecord.readFully(Unknown Source)
at com.sun.net.ssl.internal.ssl.InputRecord.read(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readDataRecord(Unknown Source)
at com.sun.net.ssl.internal.ssl.AppInputStream.read(Unknown Source)
at java.io.BufferedInputStream.fill(Unknown Source)
at java.io.BufferedInputStream.read1(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at java.io.FilterInputStream.read(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(Unknown Source)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1025)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:999)
at org.apache.commons.io.FileUtils.copyURLToFile(FileUtils.java:848)
contentType を取得するためのコード行を削除し、 を呼び出すだけcopyURLToFile(url,file)
で、ファイルがダウンロードされ、正常に保存されます。HttpURLConnection
接続がリセットされる原因となる何らかの方法で 私の取り扱いを誤っていますか?
if(contentType.equals("application/pdf")
また、回線にブレークポイントを設定して数秒待つと、接続がリセットされることなく呼び出しがcopyURLToFile
成功することにも気付きました。常に失敗するある種の競合状態を導入していますか?