Java NIO文件路径问题

时间:2012-03-23 05:59:53

标签: 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)导致同样的错误。

8 个答案:

答案 0 :(得分:32)

路径\C:\Sample\sample.txt不得包含前导\。它应该只是C:\Sample\sample.txt

答案 1 :(得分:31)

您需要将找到的资源转换为 URI 。它适用于所有平台,可以保护您免受路径可能出现的错误。您不必担心完整路径的样子,是否以“&#39; \”#39;或其他符号。如果你考虑这些细节 - 你做错了。

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

答案 2 :(得分:18)

要使其适用于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;

答案 3 :(得分:15)

为确保在任何驱动器号上的Windows或Linux上获得正确的路径,您可以执行以下操作:

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

说:如果字符串的开头是斜杠,那么一个字符,然后一个冒号和另一个斜杠,用字符,冒号和斜线替换它(保留前导斜杠)。

如果您使用Linux,那么您的路径中不应该有冒号,并且不会匹配。如果你在Windows上,这适用于任何驱动器号。

答案 4 :(得分:2)

摆脱领先分隔符的另一种方法是创建一个新文件并将其转换为字符串:

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

答案 5 :(得分:1)

尝试使用此C:\\Sample\\sample.txt

注意双反斜杠。因为反斜杠是Java String转义字符,所以必须键入其中两个以表示单个“实际”反斜杠。

Java允许在任何平台上使用任何类型的斜杠,并对其进行适当的转换。这意味着您可以输入。 C:/Sample/sample.txt

它将在Windows上找到相同的文件。但是,我们仍然将路径的“根”作为问题。

处理多个平台上的文件的最简单方法是始终使用相对路径名。文件名如Sample/sample.txt

答案 6 :(得分:0)

正常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:\\"));

答案 7 :(得分:0)

根据要使用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);