[英]Is there a clean and easy way to make file path strings in Java OS agnostic?
我创建了一个类,它接受任何一种格式的字符串(例如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代码,我必须在程序中指定路径的任何地方插入此函数。 有没有办法让字符串自动特定于操作系统?
否则,任何采用路径的OS功能在引擎盖下自动更改的设置。
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;
对于可以指向不同文件系统的路径:
String separator = path.getFileSystem().getSeparator();
通常, Path是一个存储名称部分,文件系统的漂亮类。 它涵盖了许多方面,如".."
。
处理这种情况的最好方法是不要尝试检测操作系统,因为这可能是相当不错的。 相反,Java API确实提供了一种方法来告诉您要用作路径分隔符的字符。 请查看文件: https ://docs.oracle.com/javase/8/docs/api/java/io/File.html上的此API文档,并查找特定的静态字段separator
。 我强烈建议您使用File类解析路径,然后如果您需要将路径作为字符串,只需调用toURI().toString()
将其转换为操作系统可识别的格式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.