鍍金池/ 教程/ Java/ Java路徑操作
Java文件屬性
Java FilePermission示例
Java Externalizable實(shí)例
Java文件操作
Java文件鎖
Java文件系統(tǒng)
Java異步I/O
Java Reader/Writer
Java File實(shí)例
Java FileReader示例
Java控制臺(tái)
Java文件所有者權(quán)限
Java通道
Java ByteArrayOutputStream示例
BufferedOutputStream示例
Java FileInputStream示例
Java DataInputStream
Java BufferedInputStream
Java Jar Manifest
Java Console類示例
BufferedWriter示例
Java輸入/輸出教程
Java對(duì)象序列化
Java文件教程
Java DataInputStream類型
Java Zip字節(jié)數(shù)組
Java FileWriter示例
FileOutputStream示例
Java PrintStream
Java Scanner類
BufferedInputStream示例
Java字符集
ByteArrayInputStream示例
Java路徑操作
Java DataOutputStream
Java符號(hào)鏈接
Java FilterWriter示例
Java Jar API
BufferedReader實(shí)例
Java Pipe(管道)
Java jar文件
Java CharArrayReader示例
Java CharArrayWriter示例
Java PushbackInputStream
Java FilterReader示例
Java zip文件
Java InputStream
Java標(biāo)準(zhǔn)輸入/輸出/錯(cuò)誤流
Java文件內(nèi)容和讀寫(xiě)
Java FilterInputStream示例
Java內(nèi)存通道
Java路徑
Java令牌和字符串拆分
Java隨機(jī)訪問(wèn)文件
Java文件樹(shù)
Java緩沖區(qū)讀寫(xiě)
Java FileOutputStream
Java目錄事件
Java FilterOutputStream示例
Java DataOutputStream實(shí)例
FileDescriptor示例

Java路徑操作

比較路徑

可以基于它們的文本表示來(lái)比較兩個(gè)Path對(duì)象的相等性。equals()方法通過(guò)比較它們的字符串形式來(lái)測(cè)試兩個(gè)Path對(duì)象的相等性。等式測(cè)試是否區(qū)分大小取決于文件系統(tǒng)。

以下代碼顯示如何比較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()方法在不解析實(shí)際文件引用的情況下以文本方式比較兩個(gè)路徑,并且不會(huì)測(cè)試文件系統(tǒng)中是否存在路徑。

Path接口實(shí)現(xiàn)java.lang.Comparable接口??梢允褂盟?code>compareTo()方法來(lái)與另一個(gè)Path對(duì)象進(jìn)行文本比較。

compareTo()方法返回一個(gè)int類型的值。

  • 0 - 表示兩條路徑相等。
  • 小于0 - 路徑小于指定的路徑。
  • 大于0 - 路徑大于指定的路徑。

上面的代碼生成以下結(jié)果。

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()方法分別測(cè)試路徑是否以給定路徑結(jié)尾和開(kāi)始。
上面代碼生成以下結(jié)果 -

0
38

實(shí)例-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);
    }
}

上面的代碼生成以下結(jié)果。

true

實(shí)例-3

以下代碼演示了isSameFile()方法的工作原理。 它檢查如果兩個(gè)路徑將找到相同的文件。

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();
    }
  }
}

規(guī)范化路徑

Path接口的normalize()方法在刪除點(diǎn)字符后返回一個(gè)Path。此方法不訪問(wèn)文件系統(tǒng)。
以下代碼顯示了在Windows上標(biāo)準(zhǔn)化路徑的一些示例。

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);
    }
}

執(zhí)行上面的代碼,生成以下結(jié)果 -

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)方法組合兩個(gè)路徑。如果指定的路徑是絕對(duì)路徑,則返回指定的路徑。如果指定的路徑是空路徑,則返回路徑。

在其他情況下,它只是組合兩個(gè)路徑并返回結(jié)果,因此返回的路徑以指定的路徑結(jié)束。
以下代碼具有一些解析路徑的示例。

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));
    }
}

上面的代碼生成以下結(jié)果。

C:\Java_Dev\test1.txt
C:\test.txt
C:\Java_Dev
Java_Dev\Test\test4.txt

相對(duì)路徑

Path接口的relativize(Path p)方法獲得給定路徑相對(duì)于另一個(gè)路徑的相對(duì)路徑。
以下代碼有一些獲取相對(duì)路徑的示例。

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));
    }
}

上面的代碼生成以下結(jié)果。

recent\Test
..\..
..\Def
..\Abc