java.nio.file.Path 的字符串

String of java.nio.file.Path

提问人:alexdlaird 提问时间:9/18/2023 最后编辑:alexdlaird 更新时间:9/18/2023 访问量:71

问:

可以解释我在这里做错了什么和/或遗漏了什么。我的对象在我的 Java 应用程序中运行良好。唯一的问题是当我尝试在日志中打印它们时,该问题仅存在于 Windows 上。当我字符串化一个对象(或对象)时,我会得到一些路径,就像在 Linux、Unix、Mac 上一样,但在 Windows 上它打印为 .我希望看到的是,但在 Windows 上省略了斜杠。java.nio.file.PathPathFilebuild/somefile.txtbuildsomefile.txtbuild\\somefile.txt

这是我在 Mac、Ubuntu 和 Windows 上使用 Java 11 和 Java 17 执行的简单示例代码:

import java.nio.file.Paths;

System.out.println(Paths.get("build", "somefile.txt"));
System.out.println(Paths.get("build", "somefile.txt").toFile());
System.out.println(Paths.get("build", "somefile.txt").toFile().getPath());

如果我规范化路径、转换为绝对路径等,则行为相同。从 Path 的文档来看,在我看来应该在这里使用,这是我在非 Windows 系统上看到的行为。文档还指定 Windows 分隔符为 .谁能帮我理解我在这里错过了什么?谢谢!toString()File.separator\\

编辑:

这些也都输出空字符串:

import java.nio.file.File;
System.out.println(File.separator);
System.out.println(File.separatorChar);

值得注意的是,如果这是相关的,我在测试中看到了这一点。

Java Windows 路径 到字符串

评论


答:

3赞 rzwitserloot 9/18/2023 #1

Java 正在发出你所期望的。具体来说,java 会发出一个字节序列来标准输出,然后进行一次旅行。它进入操作系统,操作系统将其发送到与你的 java 进程标准相关的任何内容,该标准可能在某个时候获取这些字节,将其转换回字符串,然后用它做一些事情。希望在这场狂野的冒险中,最终会在某个地方将它变成一些角色的小图片,最终,这些角色会呈现到你的屏幕上,然后从那里进入你的眼球。build\someFile.txt

在那场狂野的冒险中,有些东西正在应用反斜杠转义。终端不这样做,所以你在问题中没有提到的其他东西正在这样做。Java 当然不会这样做。还有别的东西。如果你只是写这个非常基本的:

class Test {
  public static void main(String[] args) throws Exception {
    Path x = Path.of("foo/bar.txt");
    System.out.println(x);
  }
}

并在股票标准 Windows 终端中的股票窗口上运行它,该终端按您预期的方式打印。cmd.exefoo\bar.txt

检查 java 进程和您的眼球之间的应用程序链。他们中的一个正在搞砸这件事。如果您在此过程中需要一些帮助,请编辑问题并详细解释(因为您可能不知道相关内容,这种 mojibake / 终端的东西可能像那样棘手)每个可能介于两者之间的应用程序或事物。您是否在 IDE 中运行它?哪一个,以及如何。您是否在 linux 的 Windows 子系统上运行它?提及这一点,你是如何做到的,你输入了哪些命令,等等。

评论

1赞 alexdlaird 9/18/2023
啊,我没有考虑过 IDE 和终端可能会向我隐瞒这一点的想法,很棒的观察!这是一个相当简单的应用程序,所以我的猜测是它在某处被 Gradle 和/或 JUnit 流吞噬了......我会继续四处闲逛并更新,如果我找到确切的东西正在从我的显示器中吞噬它。谢谢!
0赞 alexdlaird 9/18/2023
我通常不在 Windows 上开发,我最近才在适用于 Windows 构建的 GitHub Actions 的日志输出中注意到这一点,这就是我对此感到好奇的原因。当我跳上 Windows VM 并从命令提示符运行时,我看到了同样的问题。不过,根据您的建议,我在 Windows VM 上下载了 IntelliJ 并删除了一个断点。果然,“”就在那里,所以一切都很好。我很好奇为什么 GitHub Actions / Gradle 和 Windows Command Prompt 会吞下这个角色,但由于它只是美学,我现在不担心它。谢谢你帮我确认!make tests
0赞 rzwitserloot 9/18/2023
许多 java 程序员甚至非 java 程序员习惯性地只是在他们的脚本等中使用路径分隔符。在 java 中,这是一个悠久的传统,因为代码中的所有路径规范都可以具有它(在 Windows 上工作,就像现在一样)。这给 github 带来了更小的压力,使反斜杠正常工作。/Path.of("dir/subdir/file.txt")new File("C:/Program Files/whatever")