sysLoader.problème getResource() en java
j'ai les lignes de code suivantes.
sysLoader = (URLClassLoader)Thread.currentThread().getContextClassLoader();
url = sysLoader.getResource("tempFile.txt");
ça donne un problème bizarre. Si je l'exécute à partir d'un chemin où il n'y a pas d'espace dans le chemin (noms de dossiers) alors il fonctionne correctement. Mais si le chemin contient des espaces (ligne )c:New Foler...") alors il n'est pas de travail.
comment résoudre cela?
EDIT: En plus de détails - j'ai inspecté le sysloader objet.
sysloader - > UCP - > path
a un chemin avec un caractère %20 au lieu de l'espace
et donc toutes les URLs sont nulles.
Comment résoudre ce problème?
3 réponses
cela est connu par Sun / Oracle, leur conseil est D'utiliser des objets URI qui supprimera le %20 caractères:
au lieu de faire ceci:
FileInputStream fis = new FileInputStream(url.getFile());
vous pouvez forcer n'importe quels caractères échappés à %à être décodés en convertissant d'abord L'URL en URI, et puis utiliser le composant path de L'URI comme nom de fichier:
URI uri = new URI(url.toString());
FileInputStream fis = new FileInputStream(uri.getPath());
utiliser URLDecoder.decode()
méthode pour remplacer %20
par des espaces.
String path = URLDecoder.decode(url.getPath(), "UTF-8");
s'il vous plaît aussi garder à l'esprit que lorsque la ressource est située dans le fichier jar, vous devez la traiter de manière différente. Voir par exemple ici: comment accéder aux ressources dans le jar où il peut être présent dans plusieurs jar
pour obtenir L'URL du fichier à partir de la chaîne, lorsque le chemin contient des espaces, c'est ce qui a fonctionné pour moi:
File file = new File("/Users/work space/tempFile.txt");
URL url = file.toURI().toURL();
selon Javadocs, file.toURL()
est déprécié :
cette méthode n'échappe pas automatiquement aux caractères illégaux dans les URLs. Il est recommandé que le nouveau code convertisse un chemin abstrait en URL en le convertissant d'abord en URI, via la méthode toURI, puis conversion de L'URI en une URL via L'URI.méthode toURL.
donc utilisé file.toURI().toURL()
.
Pour Java 7+, cette approche peut être pris à la place:
URL url = Paths.get("/Users/work space/tempFile.txt").toURI().toURL());
Note : si le chemin commence par un /
il est considéré comme absolu sinon pris comme un chemin relatif.