是否有一种干净简单的方法来使 Java OS 中的文件路径字符串不可知?

Is there a clean and easy way to make file path strings in Java OS agnostic?

我制作了一个 class,它接受任何一种格式的字符串(例如 UNIX)并转换为任何 OS 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 代码,我必须在程序中指定路径的任何地方插入此函数。有没有办法让路径像字符串一样自动 OS 具体?

否则,任何采用路径的 OS 函数的设置都会在后台自动更改。

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

使用Path with Files.

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

此class 是File 的概括,仅适用于纯文件系统文件。 路径可能指向使用 zip 文件系统等的 .zip 的子目录。

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

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

path.toRealPath()

旧的File你可以使用:

String separator = File.separator;

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

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

一般来说 Path 是一个漂亮的 class 存储名称部分,文件系统。 它涵盖了很多方面,例如 "..".