[英]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.