web-dev-qa-db-fra.com

InputStream à partir d'une URL

Comment puis-je obtenir un InputStream à partir d'une URL?

par exemple, je veux prendre le fichier à l'URL wwww.somewebsite.com/a.txt et lisez-le en tant que InputStream en Java, via un servlet.

J'ai essayé

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

mais ce que j'ai eu était une erreur:

Java.io.FileNotFoundException
106
Whitebear

Utilisez Java.net.URL#openStream() avec une URL correcte (y compris le protocole!). Par exemple.

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

Voir également:

199
BalusC

Essayer:

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

(a) wwww.somewebsite.com/a.txt n'est pas une "URL de fichier". Ce n'est pas une URL du tout. Si vous mettez http:// Au début, ce sera une URL HTTP, ce qui est clairement ce que vous avez l'intention de faire ici.

(b) FileInputStream est destiné aux fichiers, pas aux URL.

(c) Le moyen d'obtenir un flux d'entrée à partir de any L'URL est via URL.openStream(), ou URL.getConnection().getInputStream(),, ce qui est équivalent, mais vous pouvez avoir d'autres raisons d'obtenir le URLConnection et commencez par jouer avec.

10
user207421

Votre code d'origine utilise FileInputStream, qui permet d'accéder aux fichiers hébergés du système de fichiers.

Le constructeur que vous avez utilisé tentera de localiser un fichier nommé a.txt dans le sous-dossier www.somewebsite.com du répertoire de travail en cours (valeur de la propriété système user.dir). Le nom que vous fournissez est résolu en fichier à l'aide de la classe File.

Les objets URL sont le moyen générique de résoudre ce problème. Vous pouvez utiliser des URL pour accéder aux fichiers locaux mais également aux ressources hébergées sur le réseau. La classe d'URL supporte le protocole file: // en plus de http: // ou https: //, vous pouvez donc continuer.

4
Cristian Botiza

Pure Java:

 urlToInputStream(url,httpHeaders);

Avec un peu de succès, j'utilise cette méthode. Il gère les redirections et on peut passer un nombre variable de en-têtes HTTP asMap<String,String>. Il a également permet les redirections de HTTP vers 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);
    }
}

Exemple d'appel complet

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