web-dev-qa-db-ja.com

Java NIOファイルパスの問題

次のコードを使用してパスを取得しました

_Path errorFilePath = FileSystems.getDefault().getPath(errorFile);
_

File NIOを使用してファイルを移動しようとすると、次のエラーが表示されます。

_Java.nio.file.InvalidPathException: Illegal char <:> at index 2: \C:\Sample\sample.txt
_

また、 URL.encode(errorFile) を使用してみましたが、同じエラーが発生しました。

44
Kathir

パス\C:\Sample\sample.txtの先頭に\を含めることはできません。ただC:\Sample\sample.txtでなければなりません

33
Jim Garrison

見つかったリソースを[〜#〜] uri [〜#〜]に変換する必要があります。それはすべてのプラットフォームで動作し、パスで起こりうるエラーから保護します。 「\」または他の記号で始まるフルパスがどのように見えるかを心配してはいけません。そのような詳細について考える場合-あなたは何か間違ったことをします。

ClassLoader classloader = Thread.currentThread().getContextClassLoader();
String platformIndependentPath = Paths.get(classloader.getResource(errorFile).toURI()).toString();
31
Alexandr

WindowsとLinux\OS Xの両方で動作させるには、次のことを検討してください。

_String osAppropriatePath = System.getProperty( "os.name" ).contains( "indow" ) ? filePath.substring(1) : filePath;
_

パフォーマンスを心配したい場合は、System.getProperty( "os.name" ).contains( "indow" )を次のような定数として保存します。

_private static final boolean IS_WINDOWS = System.getProperty( "os.name" ).contains( "indow" );
_

次に使用します:

_String osAppropriatePath = IS_WINDOWS ? filePath.substring(1) : filePath;
_
18
Tobogganski

任意のドライブ文字でWindowsまたはLinuxで正しいパスを取得するには、次のようなことができます。

path = path.replaceFirst("^/(.:/)", "$1");

つまり、文字列の先頭がスラッシュ、次に文字、次にコロン、もう1つのスラッシュの場合、文字、コロン、およびスラッシュで置き換えます(先頭のスラッシュを残して)。

Linuxを使用している場合、パスにコロンが含まれないようにしてください。一致するものはありません。 Windowsを使用している場合、これはどのドライブ文字でも機能するはずです。

15
Eric

先頭の区切り文字を取り除く別の方法は、新しいファイルを作成し、それを文字列に変換することです:

new File(Platform.getInstallLocation().getURL().getFile()).toString()
2
jome

このように使用してみてくださいC:\\Sample\\sample.txt

二重のバックスラッシュに注意してください。バックスラッシュはJava Stringエスケープ文字であるため、単一の「実際の」バックスラッシュを表すには2つ入力する必要があります。

または

Javaでは、どちらのタイプのスラッシュも任意のプラットフォームで使用でき、適切に変換されます。これは、入力できることを意味します。 C:/Sample/sample.txt

windows上で同じファイルを見つけます。ただし、パスの「ルート」が問題として残っています。

複数のプラットフォーム上のファイルを処理する最も簡単な解決策は、常に相対パス名を使用することです。 Sample/sample.txtのようなファイル名

1

通常のWindows環境

免責事項:私はこれを通常のWindows環境でテストしていません。

"\\C:\\""C:\\"である必要があります

final Path errorFilePath = Paths.get(FileSystems.getDefault().getPath(errorFile).toString().replace("\\C:\\","C:\\"));

LinuxのようなWindows環境

WindowsボックスにはLinuxライクな環境があるため、"/C:/""C:\\"に変更する必要がありました。

このコードは、LinuxライクなWindows環境で動作するようにテストされています:

final Path errorFilePath = Paths.get(FileSystems.getDefault().getPath(errorFile).toString().replace("/C:/","C:\\"));
0
Korey Hinton

Pathオブジェクトの使用方法によっては、Pathの使用をまったく回避できる場合があります。

// 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);
0
golimar