Java 路徑操作

2018-02-05 16:26 更新

Java IO教程 - Java路徑操作

比較路徑

我們可以基于它們的文本表示來比較兩個(gè)Path對(duì)象的相等性。

equals()方法通過比較它們的字符串形式來測(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接口。我們可以使用它的compareTo()方法來與另一個(gè)Path對(duì)象進(jìn)行文本比較。

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

  • 0 - 當(dāng)兩條路徑相等時(shí)
  • 小于0 - 路徑小于指定的路徑
  • 大于0 - 路徑大于指定的路徑

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


例子

以下代碼顯示如何使用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é)尾和開始。

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


例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é)果。

例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。

此方法不訪問文件系統(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);
  }
}

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

解決路徑

我們可以使用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é)果。

相關(guān)路徑

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é)果。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)