Je voudrais lire une ressource de mon pot comme ceci:
File file;
file = new File(getClass().getResource("/file.txt").toURI());
BufferredReader reader = new BufferedReader(new FileReader(file));
//Read the file
et cela fonctionne très bien lors de son exécution dans Eclipse, mais si je l'exporte dans un bocal, exécutez-le, il y a une exception IllegalArgumentException:
Exception in thread "Thread-2"
java.lang.IllegalArgumentException: URI is not hierarchical
et je ne sais vraiment pas pourquoi, mais avec des tests, j'ai trouvé que si je change
file = new File(getClass().getResource("/file.txt").toURI());
à
file = new File(getClass().getResource("/folder/file.txt").toURI());
alors ça marche à l'opposé (ça marche en pot mais pas en éclipse).
J'utilise Eclipse et le dossier avec mon fichier se trouve dans un dossier de classe.
getResourceAsStream
c'est toujours une solution plus simple et plus portable au problème.Réponses:
Plutôt que d'essayer d'adresser la ressource en tant que fichier, demandez simplement au ClassLoader de renvoyer un InputStream pour la ressource à la place via getResourceAsStream :
Tant que la
file.txt
ressource est disponible sur le chemin de classe, cette approche fonctionnera de la même manière, que lafile.txt
ressource se trouve dans unclasses/
répertoire ou à l'intérieur d'unjar
.Le
URI is not hierarchical
produit parce que quelque chose va comme regard l'URI d'une ressource dans un fichier jar ceci:file:/example.jar!/file.txt
. Vous ne pouvez pas lire les entrées dans unjar
(unzip
fichier) comme s'il s'agissait d'un ancien fichier ordinaire .Cela s'explique bien par les réponses à:
la source
InputStream
existe (commeFile.exists()
) pour que mon jeu puisse dire s'il faut utiliser le fichier par défaut ou non. Merci.getClass().getResource("**/folder**/file.txt")
pour laquelle cela a fonctionné est parce que j'avais ce dossier dans le même répertoire que mon pot :).getResourceAsStream
renvoie null si la ressource n'existe pas, ce qui peut être votre test "existe".Pour accéder à un fichier dans un bocal, vous avez deux options:
Placez le fichier dans la structure de répertoires correspondant au nom de votre package (après avoir extrait le fichier .jar, il doit se trouver dans le même répertoire que le fichier .class), puis accédez-y en utilisant
getClass().getResourceAsStream("file.txt")
Placez le fichier à la racine (après avoir extrait le fichier .jar, il doit se trouver à la racine), puis accédez-y en utilisant
Thread.currentThread().getContextClassLoader().getResourceAsStream("file.txt")
La première option peut ne pas fonctionner lorsque jar est utilisé comme plugin.
la source
J'ai eu ce problème avant et j'ai fait un moyen de secours pour le chargement. Fondamentalement, la première méthode fonctionne dans le fichier .jar et la deuxième méthode fonctionne dans eclipse ou un autre IDE.
la source
Jusqu'à présent (décembre 2017), c'est la seule solution que j'ai trouvée qui fonctionne à la fois intérieur et à l'extérieur de l'IDE.
Utilisez PathMatchingResourcePatternResolver
Remarque: cela fonctionne également dans Spring-Boot
Dans cet exemple, je lis certains fichiers situés dans src / main / resources / my_folder :
la source
Le problème est que certaines bibliothèques tierces nécessitent des chemins d'accès aux fichiers plutôt que des flux d'entrée. La plupart des réponses ne traitent pas de ce problème.
Dans ce cas, une solution consiste à copier le contenu de la ressource dans un fichier temporaire. L'exemple suivant utilise jUnit
TemporaryFolder
.la source
Si vous voulez lire un fichier, je pense qu'il existe toujours une solution similaire:
la source
file:
URL.Assurez-vous que vous travaillez avec le bon séparateur. J'ai remplacé tout
/
dans un chemin relatif par unFile.separator
. Cela a bien fonctionné dans l'IDE, mais n'a pas fonctionné dans le JAR de génération.la source
Je pense que cela devrait également fonctionner en java. Le code suivant que j'utilise utilise kotlin.
la source
J'ai trouvé un correctif
Remplacez «Main» par la classe java dans laquelle vous l'avez codé. Remplacez «path» par le chemin dans le fichier jar.
par exemple, si vous mettez State1.txt dans le package com.issac.state, puis tapez le chemin d'accès "/ com / issac / state / State1" si vous exécutez Linux ou Mac. Si vous exécutez Windows, tapez le chemin d'accès comme "\ com \ issac \ state \ State1". N'ajoutez pas l'extension .txt au fichier, sauf si l'exception Fichier introuvable se produit.
la source
Vous pouvez utiliser le chargeur de classe qui lira à partir de classpath comme chemin ROOT (sans "/" au début)
la source
Si vous utilisez Spring, vous pouvez utiliser la méthode suivante pour lire le fichier à partir de src / main / resources:
la source
Pour une raison quelconque,
classLoader.getResource()
j'ai toujours renvoyé null lorsque j'ai déployé l'application Web sur WildFly 14. obtenir classLoadergetClass().getClassLoader()
ouThread.currentThread().getContextClassLoader()
retourner null.getClass().getClassLoader()
Le document API dit:"Renvoie le chargeur de classe pour la classe. Certaines implémentations peuvent utiliser null pour représenter le chargeur de classe bootstrap. Cette méthode retournera null dans ces implémentations si cette classe a été chargée par le chargeur de classe bootstrap."
peut être si vous utilisez WildFly et votre application web essayez ceci
request.getServletContext().getResource()
a renvoyé l'url de la ressource. Ici, request est un objet de ServletRequest.la source
Le code ci-dessous fonctionne avec Spring Boot (kotlin):
la source