【问题标题】:Java NIO file path issueJava NIO 文件路径问题
【发布时间】:2012-04-07 18:02:45
【问题描述】:

我使用以下代码获取路径

Path errorFilePath = FileSystems.getDefault().getPath(errorFile);

当我尝试使用 File NIO 移动文件时,我收到以下错误:

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

我也尝试使用 URL.encode(errorFile) 导致同样的错误。

【问题讨论】:

  • 我想知道为什么我的主角是'/',而不是问题中的'\'。我正在使用 Windows 10、Java 8、Spring 3.2.14.RELEASE。
  • 我们案例中的错误来自:ClassLoader.getSystemResource("something").getPath() - 在 Windows 上,它正在从 file:/C:/mypath 删除 file:

标签: java nio


【解决方案1】:

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

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

【讨论】:

  • 它比公认的答案更好,因为有时,输入路径的不是你,而是你会通过使用 ClassLoader.getResource() 之类的东西来获取它,在这种情况下它会自动添加他在接受的答案中谈到的反斜杠! +1
【解决方案2】:

路径\C:\Sample\sample.txt 不能有前导\。应该只是C:\Sample\sample.txt

【讨论】:

  • 啊...我用来获取错误文件路径的代码正在添加前导\。谢谢。
  • 哇~,获取绝对路径,开发者必须去掉头部的“/”,是不是WindowsOS或者Path类的bug?
  • 在 jenkins java.nio.file.InvalidPathException: Illegal char at index 0 处执行时遇到的相同问题:“--tags at web.TestParallel.testParallel(TestParallel. java:23) 第 23 行:结果 results = Runner.parallel(getClass(), 5, "target/surefire-reports");
【解决方案3】:

要使其同时在 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;

【讨论】:

  • @Eric 我的回答对于任何操作系统特定的行为都更为通用。两者都很有价值。
【解决方案4】:

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

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

也就是说:如果字符串的开头是一个斜杠,然后是一个字符,然后是一个冒号和另一个斜杠,则将其替换为字符、冒号和斜杠(离开前导斜杠)。

如果您使用的是 Linux,则路径中不应以冒号结尾,并且不会有匹配项。如果您使用的是 Windows,这应该适用于任何驱动器号。

【讨论】:

  • 在 OP 中,主角是 '\',虽然我得到了 '/' 字符,就像在你的回答中一样,有什么想法为什么会有差异?
  • 啊,不错。不,我不确定为什么会有差异。我亲眼看到了/。所以,如果有人看到`, they could modify the regular expression to catch the `。
  • 可以获取环境路径分隔符,或者使用"^[/\\/](.:/)" 字符类将匹配任一斜线。
【解决方案5】:

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

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

【讨论】:

    【解决方案6】:

    尝试像这样使用C:\\Sample\\sample.txt

    注意双反斜杠。因为反斜杠是一个 Java 字符串转义字符,所以您必须键入其中的两个来表示一个“真正的”反斜杠。

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

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

    在多个平台上处理文件的最简单的解决方案是始终使用相对路径名。像Sample/sample.txt这样的文件名

    【讨论】:

      【解决方案7】:

      普通 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:\\"));
      

      【讨论】:

      • 这很好,但仅当文件位于 C 驱动器上时才有效。查看我的答案,了解适用于任何驱动器号的解决方案。
      • Linux-Like Windows 是什么意思?它是 Windows 的不同发行版,还是 Windows 中有任何配置可以启用它?
      【解决方案8】:

      根据您打算如何使用 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-13
        • 1970-01-01
        • 2013-07-14
        相关资源
        最近更新 更多