可以解释我在这里做错和/或遗漏了什么。我有
java.nio.file.Path
对象在我的 Java 应用程序中运行良好。唯一的问题是当我尝试在日志中打印它们时,该问题仅出现在 Windows 上。当我对 Path
对象(或 File
对象)进行字符串化时,我在 Linux、Unix、Mac 上得到类似 build/somefile.txt
的路径,但在 Windows 上它打印为 buildsomefile.txt
。我期望看到的是 build\\somefile.txt
,但 Windows 上省略了斜杠。
这是我在 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
toString()
应该在这里使用
File.separator
,这是我在上看到的行为非 Windows 系统。该文档还指定Windows
separatorChar
是 \\
。谁能帮助我理解我在这里缺少什么?谢谢!
编辑:
这些也都输出空字符串:
import java.nio.file.File;
System.out.println(File.separator);
System.out.println(File.separatorChar);
值得注意的是,如果相关的话,我在测试中看到了这一点。
is 发出 build\someFile.txt
。具体来说,java 向标准输出发出一个字节序列,然后继续执行。它进入操作系统,操作系统将其发送到连接到 java 进程标准的任何地方,这些标准可能会在某个时刻获取这些字节,将其转换回字符串,然后对其执行某些操作。希望在这场狂野的冒险中,最终有什么东西会把它变成一些角色的小图片,这些最终会被渲染到你的屏幕上,并从那里进入你的眼球。在这场疯狂的冒险中,有一些东西正在应用反斜杠转义。终端不这样做,所以你在问题中没有提到的其他事情正在这样做。 Java当然不会这样做。还有别的事。如果你只写这个非常基本的:
class Test {
public static void main(String[] args) throws Exception {
Path x = Path.of("foo/bar.txt");
System.out.println(x);
}
}
并在库存标准窗口中的库存窗口上运行它 cmd.exe
终端,按照您的预期打印
foo\bar.txt
。检查 java 进程和您的眼球之间的应用程序链。他们中的一个人把这件事搞砸了。如果您在这个过程中需要一些帮助,请编辑问题并以令人难以忍受的细节进行解释(因为您可能不知道相关内容,这个 mojibake / 终端的东西可能会很棘手)每个可能存在的应用程序或事物之间。您在 IDE 中运行它吗?哪一个,以及如何。你在 Linux 的 Windows 子系统上运行这个吗?提到这一点,你是如何做的,你正在输入哪些命令,等等。