web-dev-qa-db-ja.com

URLからのInputStream

URLからInputStreamを取得するにはどうすればよいですか?

たとえば、URL wwww.somewebsite.com/a.txtのファイルを取得し、サーブレットを介してJavaのInputStreamとして読み取ります。

私はもう試した

InputStream is = new FileInputStream("wwww.somewebsite.com/a.txt");

しかし、私が得たのはエラーでした:

Java.io.FileNotFoundException
106
Whitebear

Java.net.URL#openStream() を適切なURL(プロトコルを含む!)とともに使用します。例えば。

InputStream input = new URL("http://www.somewebsite.com/a.txt").openStream();
// ...

こちらもご覧ください:

199
BalusC

試してください:

final InputStream is = new URL("http://wwww.somewebsite.com/a.txt").openStream();
16
whiskeysierra

(a)wwww.somewebsite.com/a.txtは「ファイルURL」ではありません。これはURLではありません。 http://を先頭に置くと、HTTP URLになります。これは明らかにここで意図したものです。

(b)FileInputStreamはURLではなくファイル用です。

(c)any URLから入力ストリームを取得する方法は、URL.openStream(),またはURL.getConnection().getInputStream(),を経由しますが、これは同等ですが、URLConnectionを取得する他の理由があるかもしれません最初に遊んでください。

10
user207421

元のコードでは、ファイルシステムがホストするファイルにアクセスするためのFileInputStreamを使用します。

使用したコンストラクターは、現在の作業ディレクトリ(システムプロパティuser.dirの値)のwww.somewebsite.comサブフォルダーでa.txtという名前のファイルを見つけようとします。指定した名前は、Fileクラスを使用してファイルに解決されます。

URLオブジェクトは、これを解決する一般的な方法です。 URLを使用してローカルファイルにアクセスできるだけでなく、ネットワークでホストされたリソースにもアクセスできます。 URLクラスは、http://またはhttps://のほかにfile://プロトコルをサポートしているので、準備は万端です。

4
Cristian Botiza

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);
    }
2
jschnasse