Java路徑操作
比較路徑
可以基於它們的文本表示來比較兩個Path
對象的相等性。equals()
方法通過比較它們的字符串形式來測試兩個Path
對象的相等性。等式測試是否區分大小取決於文件系統。
以下代碼顯示如何比較Windows路徑:
import java.nio.file.Path;
import java.nio.file.Paths;
public class Main {
public static void main(String[] args) throws Exception {
Path p1 = Paths.get("C:\\Java_Dev\\test1.txt");
Path p2 = Paths.get("C:\\Java_Dev\\LUCI1.TXT");
Path p3 = Paths.get("C:\\Java_Dev\\..\\Java_Dev\\test1.txt");
boolean b1 = p1.equals(p2);
System.out.println(b1);
boolean b2 = p1.equals(p3);
System.out.println(b2);
}
}
equals()
方法在不解析實際文件引用的情況下以文本方式比較兩個路徑,並且不會測試文件系統中是否存在路徑。
Path
接口實現java.lang.Comparable
接口。可以使用它的compareTo()
方法來與另一個Path
對象進行文本比較。
compareTo()
方法返回一個int
類型的值。
- 0 - 表示兩條路徑相等。
- 小於0 - 路徑小於指定的路徑。
- 大於0 - 路徑大於指定的路徑。
上面的代碼生成以下結果。
false
false
示例
以下代碼顯示如何使用compareTo()
方法:
import java.nio.file.Path;
import java.nio.file.Paths;
public class Main {
public static void main(String[] args) throws Exception {
Path p1 = Paths.get("C:\\Java_Dev\\test1.txt");
Path p2 = Paths.get("C:\\Java_Dev\\Test1.txt");
Path p3 = Paths.get("C:\\Java_Dev\\..\\Java_Dev\\test1.txt");
int v1 = p1.compareTo(p2);
System.out.println(v1);
int v2 = p1.compareTo(p3);
System.out.println(v2);
}
}
可以使用endsWith()
和startsWith()
方法分別測試路徑是否以給定路徑結尾和開始。
上面代碼生成以下結果 -
0
38
實例-2
以下代碼顯示瞭如何在路徑中使用endsWith()
和startsWith()
方法。
import java.nio.file.Path;
import java.nio.file.Paths;
public class Main {
public static void main(String[] args) throws Exception {
Path p1 = Paths.get("C:\\Java_Dev\\test1.txt");
Path p2 = Paths.get("test1.txt");
Path p3 = Paths.get("Java_Dev\\test1.txt");
Path p4 = Paths.get(".txt");
// Using endsWith()
boolean b1 = p1.endsWith(p2);
System.out.println(b1);
boolean b2 = p1.endsWith(p3);
boolean b3 = p1.endsWith(p4);
// Using startsWith()
Path p5 = Paths.get("C:\\");
Path p6 = Paths.get("C:\\Java_Dev");
Path p7 = Paths.get("C:\\Java_Dev");
boolean b4 = p1.startsWith(p5);
boolean b5 = p1.startsWith(p6);
boolean b6 = p1.startsWith(p7);
}
}
上面的代碼生成以下結果。
true
實例-3
以下代碼演示了isSameFile()
方法的工作原理。 它檢查如果兩個路徑將找到相同的文件。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class Main {
public static void main(String[] args) {
// Assume that C:\Java_Dev\test1.txt file exists
Path p1 = Paths.get("C:\\Java_Dev\\test1.txt");
Path p2 = Paths.get("C:\\Java_Dev\\..\\Java_Dev\\test1.txt");
// Assume that C:\abc.txt file does not exist
Path p3 = Paths.get("C:\\abc.txt");
Path p4 = Paths.get("C:\\abc.txt");
try {
boolean isSame = Files.isSameFile(p1, p2);
System.out.println("p1 and p2 are the same: " + isSame);
isSame = Files.isSameFile(p3, p4);
System.out.println("p3 and p4 are the same: " + isSame);
}catch (IOException e) {
e.printStackTrace();
}
}
}
規範化路徑
Path
接口的normalize()
方法在刪除點字符後返回一個Path。此方法不訪問文件系統。
以下代碼顯示了在Windows上標準化路徑的一些示例。
import java.nio.file.Path;
import java.nio.file.Paths;
public class Main {
public static void main(String[] args) throws Exception {
Path p1 = Paths.get("C:\\Java_Dev\\..\\\\Java_Dev\\test1.txt");
Path p1n = p1.normalize();
System.out.println(p1 + " normalized to " + p1n);
Path p2 = Paths.get("C:\\Java_Dev\\test1.txt");
Path p2n = p2.normalize();
System.out.println(p2 + " normalized to " + p2n);
Path p3 = Paths.get("\\..\\.\\test.txt");
Path p3n = p3.normalize();
System.out.println(p3 + " normalized to " + p3n);
}
}
執行上面的代碼,生成以下結果 -
C:\Java_Dev\..\Java_Dev\test1.txt normalized to C:\Java_Dev\test1.txt
C:\Java_Dev\test1.txt normalized to C:\Java_Dev\test1.txt
\..\.\test.txt normalized to \test.txt
解決路徑
可以使用Path接口的resolve(Path p)
方法組合兩個路徑。如果指定的路徑是絕對路徑,則返回指定的路徑。如果指定的路徑是空路徑,則返回路徑。
在其他情況下,它只是組合兩個路徑並返回結果,因此返回的路徑以指定的路徑結束。
以下代碼具有一些解析路徑的示例。
import java.nio.file.Path;
import java.nio.file.Paths;
public class Main {
public static void main(String[] args) throws Exception {
Path p1 = Paths.get("C:\\Java_Dev");
Path p2 = Paths.get("test1.txt");
System.out.println(p1.resolve(p2));
Path p3 = Paths.get("C:\\test.txt");
System.out.println(p1.resolve(p3));
Path p4 = Paths.get("");
System.out.println(p1.resolve(p4));
Path p5 = Paths.get("Java_Dev\\Test");
Path p6 = Paths.get("test4.txt");
System.out.println(p5.resolve(p6));
}
}
上面的代碼生成以下結果。
C:\Java_Dev\test1.txt
C:\test.txt
C:\Java_Dev
Java_Dev\Test\test4.txt
相對路徑
Path接口的relativize(Path p)
方法獲得給定路徑相對於另一個路徑的相對路徑。
以下代碼有一些獲取相對路徑的示例。
import java.nio.file.Path;
import java.nio.file.Paths;
public class Main {
public static void main(String[] args) throws Exception {
Path p1 = Paths.get("Java_Dev");
Path p2 = Paths.get("Java_Dev", "recent", "Test");
System.out.println(p1.relativize(p2));
System.out.println(p2.relativize(p1));
Path p3 = Paths.get("Abc");
Path p4 = Paths.get("Def");
System.out.println(p3.relativize(p4));
System.out.println(p4.relativize(p3));
}
}
上面的代碼生成以下結果。
recent\Test
..\..
..\Def
..\Abc