【发布时间】:2015-11-11 01:00:26
【问题描述】:
Java 中是否有任何内置的跨平台方式用于解析Windows 路径字符串并提取 Windows 的根路径(包括驱动器号)?
根据Java SE documentation,可以使用java.nio.file.Path类,例如
String path = "C:\\this\\is\\a\\windows\\file path.txt"
Path p = Paths.get(path);
String drive = p.getRoot();
但是,Path 对象构造是特定于操作系统的,这意味着上述代码只有在Windows 中执行时才会返回驱动器号;否则,它只会返回null。
当然,可以使用自定义方法(例如,正则表达式或简单的字符串处理)来检索驱动器号(如果存在),但是是否已经在 Java 中实现了跨平台的方法呢?
【问题讨论】:
-
“Java 中是否有任何内置的跨平台方法来解析 Windows 路径字符串并提取驱动器号?” - 不,因为这种方式会破坏“跨平台”的目的
-
它肯定不会,甚至
getRoot()方法的 Java SE 文档也暗示了其他情况。事实上,应用程序应该能够以相同的方式处理来自所有操作系统的路径,独立于它们运行的操作系统。这是“跨平台”的定义,而 Path 类打破了这一点,这与它自己的文档相反。 -
“事实上,应用程序应该能够以相同的方式处理来自所有操作系统的路径” - 同意,但路径是操作系统特定的概念,我的意思是Windows是唯一具有驱动器号概念的操作系统,unix的根路径只是“/”。如果我们谈论的是挂载点,那就完全不同了,这就是我的观点。我不想和你争论,你有一个我不完全理解的问题想要解决,但似乎找到了一个可行的解决方案
-
所以,我在 MacOSX 上使用
/Users/{my home directory}的path尝试了您的代码,p.getRoot()返回/。我采用相同的代码并在 Windows 上运行它并返回“C:”,因此 API 正在以跨平台方式完成它应该做的事情 -
您对
p.getRoot()的返回类型的描述是我最初在问题中所说的,它是特定于平台的,为相同的输入返回不同的值,具体取决于平台。问题很简单:给定一个路径字符串,获取根而不需要知道路径是否存在。这使得平台无关紧要——我们只想分析路径字符串,这正是Apache commons IO中的FilenameUtils类所做的。这是一个非常现实的场景,不值得投反对票。无论如何,有一个解决方案,所以我会使用它。感谢您的讨论。
标签: java windows path drive drive-letter