URLからInputStreamを取得するにはどうすればよいですか?
たとえば、URL wwww.somewebsite.com/a.txt
のファイルを取得し、サーブレットを介してJavaのInputStreamとして読み取ります。
私はもう試した
InputStream is = new FileInputStream("wwww.somewebsite.com/a.txt");
しかし、私が得たのはエラーでした:
Java.io.FileNotFoundException
Java.net.URL#openStream()
を適切なURL(プロトコルを含む!)とともに使用します。例えば。
InputStream input = new URL("http://www.somewebsite.com/a.txt").openStream();
// ...
試してください:
final InputStream is = new URL("http://wwww.somewebsite.com/a.txt").openStream();
(a)wwww.somewebsite.com/a.txt
は「ファイルURL」ではありません。これはURLではありません。 http://
を先頭に置くと、HTTP URLになります。これは明らかにここで意図したものです。
(b)FileInputStream
はURLではなくファイル用です。
(c)any URLから入力ストリームを取得する方法は、URL.openStream(),
またはURL.getConnection().getInputStream(),
を経由しますが、これは同等ですが、URLConnection
を取得する他の理由があるかもしれません最初に遊んでください。
元のコードでは、ファイルシステムがホストするファイルにアクセスするためのFileInputStreamを使用します。
使用したコンストラクターは、現在の作業ディレクトリ(システムプロパティuser.dirの値)のwww.somewebsite.comサブフォルダーでa.txtという名前のファイルを見つけようとします。指定した名前は、Fileクラスを使用してファイルに解決されます。
URLオブジェクトは、これを解決する一般的な方法です。 URLを使用してローカルファイルにアクセスできるだけでなく、ネットワークでホストされたリソースにもアクセスできます。 URLクラスは、http://またはhttps://のほかにfile://プロトコルをサポートしているので、準備は万端です。
Pure Java:
urlToInputStream(url,httpHeaders);
ある程度成功したので、この方法を使用します。それはリダイレクトを処理するであり、可変数のHTTPヘッダー asMap<String,String>
を渡すことができます。また、HTTPからHTTPSへのリダイレクトを許可。
private InputStream urlToInputStream(URL url, Map<String, String> args) {
HttpURLConnection con = null;
InputStream inputStream = null;
try {
con = (HttpURLConnection) url.openConnection();
con.setConnectTimeout(15000);
con.setReadTimeout(15000);
if (args != null) {
for (Entry<String, String> e : args.entrySet()) {
con.setRequestProperty(e.getKey(), e.getValue());
}
}
con.connect();
int responseCode = con.getResponseCode();
/* By default the connection will follow redirects. The following
* block is only entered if the implementation of HttpURLConnection
* does not perform the redirect. The exact behavior depends to
* the actual implementation (e.g. Sun.net).
* !!! Attention: This block allows the connection to
* switch protocols (e.g. HTTP to HTTPS), which is <b>not</b>
* default behavior. See: https://stackoverflow.com/questions/1884230
* for more info!!!
*/
if (responseCode < 400 && responseCode > 299) {
String redirectUrl = con.getHeaderField("Location");
try {
URL newUrl = new URL(redirectUrl);
return urlToInputStream(newUrl, args);
} catch (MalformedURLException e) {
URL newUrl = new URL(url.getProtocol() + "://" + url.getHost() + redirectUrl);
return urlToInputStream(newUrl, args);
}
}
/*!!!!!*/
inputStream = con.getInputStream();
return inputStream;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
完全なコール例
private InputStream getInputStreamFromUrl(URL url, String user, String passwd) throws IOException {
String encoded = Base64.getEncoder().encodeToString((user + ":" + passwd).getBytes(StandardCharsets.UTF_8));
Map<String,String> httpHeaders=new Map<>();
httpHeaders.put("Accept", "application/json");
httpHeaders.put("User-Agent", "myApplication");
httpHeaders.put("Authorization", "Basic " + encoded);
return urlToInputStream(url,httpHeaders);
}