我有一个由Fuse for MacOS制作的云支持文件系统。显然,此文件系统将使用不同unicode规范化表单的文件视为不同的文件。因此,您可以在NFC中拥有一个文件,在NFD中拥有另一个具有相同名称的文件。
所以我的问题是,是否可以将这两个文件名作为两个不同的字符串从Java中读取?导致File.getName()
,File.getPath()
,Path.getFileName()
等似乎返回两个文件的NFC规范化字符串,因此将它们视为相等。
答案 0 :(得分:1)
所以我认为我在撰写问题时找到了答案,看起来有一种方法可以将文件名设置为原始的规范化形式,即通过Path.toUri()
方法。有趣的是,File.toURI()
并没有做同样的事情。
这是一个有效的例子:
Files.list(Paths.get("/path/to/my/folder"))
.filter(Files::isRegularFile)
.forEach((f) -> System.out.println(org.apache.commons.codec.binary.Hex.encodeHex(f.toUri().getPath().getBytes())));
这是一个没有:
File folder = new File("/path/to/my/folder");
File[] listOfFiles = folder.listFiles();
for (int i = 0; i < listOfFiles.length; i++) {
if (listOfFiles[i].isFile()) {
System.out.println(org.apache.commons.codec.binary.Hex.encodeHex(listOfFiles[i].toURI().getPath().getBytes()));
}
}