J'ai cette ligne dans mon programme:
InputStream Resource_InputStream=this.getClass().getClassLoader().getResourceAsStream("Resource_Name");
Mais comment puis-je obtenir FileInputStream [Resource_InputStream]?
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.
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.
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 .