在 Rust 中,操作系统文件路径使用特定的
Path
类型而不是 str
来存储。这是因为 str
表示 UTF-8 字节序列,而内核要么不强制执行任何类型的编码 (Unix),只要斜线用其 ASCII 代码点表示,要么以 16 位编码进行编码( Windows)。
在Java中,路径使用标准库中的String类型来表示,该类型内部使用UCS-2。这不是特定于实现的,因为某些 String 方法会以某种方式“泄漏”此编码。
Java 如何将 Unix 的任意字节序列路径表示为 Unicode?我假设它将路径视为 ASCII 或 UTF-8,以便将“原始”字节映射到 Unicode 代码点,因为路径实际上几乎总是 ASCII 或 UTF-8,但是如果存在无效的字节序列怎么办ASCII 还是 UTF-8?到 Unicode/UCS-2 的转换是否无损?是否有可来回记录的算法?如果我不想排除非拉丁字母用户,在处理 Java 中的文件路径时我应该考虑什么?
你的问题不清楚,但这里是。
Java 作为平台的设计中的一个主要问题是您与主机操作系统的细节隔离。
其中包括有关主机操作系统所使用的文件系统的详细信息。如果您使用捆绑的 Java 类与文件交互(提示:NIO.2),那么您无需关心主机操作系统文件系统内部的位和字节。处理这些文件系统详细信息是 (a) 编写操作系统的人员和 (b) 编写 Java 实现(例如 OpenJDK)的人员的工作。 Java 的部分乐趣并不在于处理这些事情。
例如,我在 macOS Sonoma 14.4.1 的 Finder.app 中创建了嵌套的文件夹层次结构。我使用谷歌翻译翻译了俄语中的“苹果”,罗马尼亚语中的“香蕉”,日语中的“胡萝卜”。在该文件夹中,我创建了一个 UTF-8 编码的纯文本文件,名称为法语“data”。该文件包含一行:
Bonjour!
。
使用 Java NIO.2,我通过
Path
(复数)类用 Paths
对象表示该文件的路径。
final String HOME = System.getProperty( "user.home" ); // /Users/basil_dot_work for me on macOS.
final Path path = Paths.get( HOME, "Яблоко" , "Banană" , "にんじん" , "données.txt" ); // Apple in Russian, Banana in Romanian, Carrot in Japanese.
这里的重点是,我不知道苹果工程师如何在各个文件夹名称中对各种语言进行编码。我不在乎。 Java 代表我负责与 macOS 文件系统进行交互。它的工作原理要感谢 Apple 开发人员和任何其他为 OpenJDK 项目 macOS 分支做出贡献的人。
接下来,我使用
Files.lines
打开该文件来读取 Stream
行,每行都是 String
对象。
try
{
Files
.lines( path , StandardCharsets.UTF_8 )
.forEach( System.out :: println );
} catch ( IOException e )
{
throw new RuntimeException( e );
}
在 Java 22 中运行时的结果:
你好!