web-dev-qa-db-fra.com

Comment convertir InputStream en FileInputStream

J'ai cette ligne dans mon programme:

InputStream Resource_InputStream=this.getClass().getClassLoader().getResourceAsStream("Resource_Name");

Mais comment puis-je obtenir FileInputStream [Resource_InputStream]?

57
Frank

Utilisez ClassLoader#getResource() à la place si son URI représente un chemin de système de fichiers valide sur un disque local.

URL resource = classLoader.getResource("resource.ext");
File file = new File(resource.toURI());
FileInputStream input = new FileInputStream(file);
// ...

Si ce n’est pas le cas (par exemple, JAR), le mieux est de le copier dans un fichier temporaire.

Path temp = Files.createTempFile("resource-", ".ext");
Files.copy(classLoader.getResourceAsStream("resource.ext"), temp, StandardCopyOption.REPLACE_EXISTING);
FileInputStream input = new FileInputStream(temp.toFile());
// ...

Cela dit, je ne vois vraiment aucun avantage à le faire, ou cela doit être requis par une classe/méthode d'aide pauvre qui nécessite FileInputStream au lieu de InputStream. Si vous le pouvez, corrigez simplement l'API pour demander un InputStream à la place. S'il s'agit d'une tierce partie, signalez-le comme un bogue. Dans ce cas précis, j'aurais également mis des points d'interrogation sur le reste de cette API.

63
BalusC

Histoire longue: N'utilisez pas FileInputStream en tant que type de paramètre ou de variable. Utilisez la classe de base abstraite, dans ce cas, InputStream à la place.

12
whiskeysierra

Vous avez besoin de quelque chose comme:

    URL resource = this.getClass().getResource("/path/to/resource.res");
    File is = null;
    try {
        is = new File(resource.toURI());
    } catch (URISyntaxException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    try {
        FileInputStream input = new FileInputStream(is);
    } catch (FileNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

Mais cela ne fonctionnera que dans votre IDE, pas dans un fichier JAR exécutable. J'ai eu le même problème expliqué ici .

0
Nenad Bulatovic