J'ai utilisé le code suivant pour obtenir le chemin
Path errorFilePath = FileSystems.getDefault().getPath(errorFile);
Lorsque j'essaie de déplacer un fichier à l'aide du fichier NIO, j'obtiens l'erreur ci-dessous:
Java.nio.file.InvalidPathException: Illegal char <:> at index 2: \C:\Sample\sample.txt
J'ai également essayé d'utiliser URL.encode(errorFile)
ce qui entraîne la même erreur.
Le chemin \C:\Sample\sample.txt
ne doit pas avoir de début \
. Ce devrait être juste C:\Sample\sample.txt
Vous devez convertir la ressource trouvée en URI . Il fonctionne sur toutes les plateformes et vous protège contre d'éventuelles erreurs de chemins. Vous ne devez pas vous soucier de l'apparence du chemin complet, qu'il commence par "\" ou par d'autres symboles. Si vous pensez à de tels détails - vous faites quelque chose de mal.
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
String platformIndependentPath = Paths.get(classloader.getResource(errorFile).toURI()).toString();
Pour le faire fonctionner à la fois sur Windows et Linux\OS X, envisagez de faire ceci:
String osAppropriatePath = System.getProperty( "os.name" ).contains( "indow" ) ? filePath.substring(1) : filePath;
Si vous voulez vous soucier des performances, je stocke System.getProperty( "os.name" ).contains( "indow" )
comme une constante comme
private static final boolean IS_WINDOWS = System.getProperty( "os.name" ).contains( "indow" );
puis utilisez:
String osAppropriatePath = IS_WINDOWS ? filePath.substring(1) : filePath;
Pour être sûr d'obtenir le bon chemin sous Windows ou Linux sur n'importe quelle lettre de lecteur, vous pouvez faire quelque chose comme ceci:
path = path.replaceFirst("^/(.:/)", "$1");
Cela dit: si le début de la chaîne est une barre oblique, puis un caractère, puis deux points et une autre barre oblique, remplacez-le par le caractère, les deux points et la barre oblique (en laissant la barre oblique principale désactivée).
Si vous êtes sous Linux, vous ne devriez pas vous retrouver avec deux points sur votre chemin, et il n'y aura pas de correspondance. Si vous êtes sous Windows, cela devrait fonctionner pour n'importe quelle lettre de lecteur.
Une autre façon de se débarrasser du séparateur principal est de créer un nouveau fichier et de le convertir en chaîne, puis:
new File(Platform.getInstallLocation().getURL().getFile()).toString()
essayez d'utiliser comme ça C:\\Sample\\sample.txt
Notez les doubles barres obliques inverses. Étant donné que la barre oblique inverse est un caractère Java Caractère d'échappement de chaîne, vous devez en saisir deux pour représenter une barre oblique inversée "réelle").
ou
Java permet à l'un ou l'autre type de barre oblique d'être utilisé sur n'importe quelle plate-forme et le traduit de manière appropriée. Cela signifie que vous pouvez taper. C:/Sample/sample.txt
et il trouvera le même fichier sous Windows. Cependant, nous avons toujours la "racine" du chemin d'accès comme problème.
La solution la plus simple pour gérer des fichiers sur plusieurs plates-formes consiste à toujours utiliser des noms de chemin relatifs. Un nom de fichier comme Sample/sample.txt
Avertissement: je n'ai pas testé cela sur un environnement Windows normal.
"\\C:\\"
doit être "C:\\"
final Path errorFilePath = Paths.get(FileSystems.getDefault().getPath(errorFile).toString().replace("\\C:\\","C:\\"));
Ma boîte Windows a un environnement semblable à Linux, j'ai donc dû changer "/C:/"
être "C:\\"
.
Ce code a été testé pour fonctionner sur un environnement Windows de type Linux:
final Path errorFilePath = Paths.get(FileSystems.getDefault().getPath(errorFile).toString().replace("/C:/","C:\\"));
Selon la façon dont vous allez utiliser l'objet Path, vous pourrez peut-être éviter d'utiliser Path du tout:
// works with normal files but on a deployed JAR gives "Java.nio.file.InvalidPathException: Illegal char <:> "
URL urlIcon = MyGui.class.getResource("myIcon.png");
Path pathIcon = new File(urlIcon.getPath()).toPath();
byte bytesIcon[] = Files.readAllBytes(pathIcon);
// works with normal files and with files inside JAR:
InputStream in = MyGui.class.getClassLoader().getResourceAsStream("myIcon.png");
byte bytesIcon[] = new byte[5000];
in.read(bytesIcon);