【问题标题】:Extracting the drive letter from a Windows path string从 Windows 路径字符串中提取驱动器号
【发布时间】: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

当然,可以使用自定义方法(例如,正则表达式或简单的字符串处理)来检索驱动器号(如果存在),但是是否已经在 J​​ava 中实现了跨平台的方法呢?

【问题讨论】:

  • “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


【解决方案1】:

Java 中似乎没有内置的跨平台方式来检索文件的根路径(例如驱动器),因此第三方库或自定义代码是唯一的解决方案。

Apache Commons IO 有一个 FilenameUtils 类,它的 getPrefix() 方法完全符合问题的要求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    相关资源
    最近更新 更多