【问题标题】:Is there a clean and easy way to make file path strings in Java OS agnostic?有没有一种干净简单的方法可以使 Java OS 中的文件路径字符串不可知?
【发布时间】:2019-07-02 11:46:16
【问题描述】:

我已经创建了一个类,它接受一种格式的任何字符串(例如 UNIX)并转换为运行 java 的任何操作系统。

enum OperatingSystem {
    WINDOWS,
    LINUX;

    static OperatingSystem initOS() {
        String osName = System.getProperty("os.name");

        switch (osName) {
            case "Windows 8.1":
               return WINDOWS;
            case "Linux":
               return LINUX;
            default:
                return LINUX;
        }
    }

}



public class OSSP {
    public static final OperatingSystem USEROS = OperatingSystem.initOS();


//    Auxilarry methods to return OSAppropriateString
    private static String makeLinuxCompatible(String[] path) {
        return String.join("/", path);
    }

    private static String makeWindowsCompatible(String[] path) {
        return String.join("\\", path);
    }

    public static String getOSSpecificPath(String path) {
        String[] splittedPath = {""}, subpath = {""};
        String finalPath = "";
        if(path.contains("\\")) {
            splittedPath = path.split("\\\\",-1);
        }
        else if (path.contains("/")) {
            splittedPath = path.split("/",-1);
        }

        if (USEROS == OperatingSystem.LINUX) {
            finalPath =  makeLinuxCompatible(splittedPath);
        }
        else if (USEROS == OperatingSystem.WINDOWS) {
            finalPath =  makeWindowsCompatible(splittedPath);
        }
        return finalPath;
    }
}

如果您正在编写小代码并且必须经常这样做,这很好。

但是,我有一个巨大的 GUI 代码,我必须在程序中指定路径的任何地方插入这个函数。有没有办法让像字符串这样的路径自动特定于操作系统?

否则,任何采用路径的操作系统功能都会在后台自动相应更改。

【问题讨论】:

  • 只使用 File.separator
  • 仅供参考,macOS 上默认使用的文件系统使用冒号作为路径分隔符,而不是斜杠。方便的是,Mac 的 JVM 会自动转换带有正斜杠 SOLIDUS 分隔符的 Unix 样式路径,就好像它们是冒号字符一样。不知道其他平台上的JVM实现有没有类似的。
  • 我能想到的最简洁的方法是从java.io.File 切换到java.nio.file.Path。它已经拥有与您创建的 API 大致相同的 API,但由 JDK 作者而不是您支持,从而减轻了您自己测试所有内容的负担。
  • @JEY,更好的是,上面的所有代码都可以替换为Paths.get("/", path),我很确定。他正在使用 Java 8,没有真正的理由继续使用 File

标签: java string filepath


【解决方案1】:

PathFiles 一起使用。

Path path = Paths.get(".../...");
Path path = Paths.get("...", "...");
// path.resolve, relativize, normalize, getFileSystem

该类是File 的泛化,仅适用于纯文件系统文件。 路径可能指向使用 zip 文件系统等的 .zip 的子目录。

对于使用 API 建立的文件,可以使用 Path.toFile()File.toPath()

Paths.get 非常通用,这也归功于 Windows 的 Posix 兼容性(除了 \ 之外,还接受 /)。无论如何,您都可以获得规范的标准化路径。

path.toRealPath()

您可以使用旧的File

String separator = File.separator;

对于可以指向不同file systems的路径:

String separator = path.getFileSystem().getSeparator();

一般而言,Path 是一个漂亮的类,用于存储名称部分,即文件系统。 它涵盖了许多方面,例如".."

【讨论】:

    【解决方案2】:

    处理这种情况的最佳方法是不要尝试检测操作系统,因为这可能是偶然的。相反,Java API 确实提供了一种方法来告诉您使用什么字符作为路径分隔符。查看 File:https://docs.oracle.com/javase/8/docs/api/java/io/File.html 上的 API 文档并查找特定的静态字段 separator。我强烈建议您使用 File 类解析路径,然后如果您需要将路径作为字符串,只需调用 toURI().toString() 将其转换为操作系统可以识别的格式。

    【讨论】:

      猜你喜欢
      • 2014-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 2011-04-14
      相关资源
      最近更新 更多