2015-01-03 33 views
5

z książki "Kathy Sierra Bert Bates" do egzaminu OCP znalazłem następujący kodGlob wzór używając getPathMatcher

public class FileTest { 

    public static void matches(Path path, String glob){ 
     PathMatcher matcher = FileSystems.getDefault().getPathMatcher(glob); 
     System.out.println(matcher.matches(path)); 
    } 
    public static void main(String[] args) throws IOException { 
     Path path = Paths.get("/com/java/One.java"); 
     matches(path, "glob:*.java"); 
     matches(path, "glob:**/*.java"); 
     matches(path, "glob:*"); 
     matches(path, "glob:**"); 

    } 
} 

wyjściowa:

false 
true 
false 
true 

Nie mogę zrozumieć jasno wyjście. Czy ktokolwiek mógłby mi wyjaśnić? daj mi znać, jaki jest przykład przekraczania granic katalogów. Dzięki Rocky

+2

nie wiem uzyskać dane wyjściowe, które podano dla ścieżki wejściowej. Ale dostaję twoje dane wyjściowe, kiedy po prostu przekazuję nazwę pliku - 'Paths.get (" One.java ")'. W systemie Windows system plików NTFS. Z którym systemem operacyjnym i systemem plików testowałeś ten kod? – BatScream

+0

@BatScream kod działa dla mnie tak, jak jest w systemie operacyjnym Windows, i otrzymuję ten sam wynik, o którym wspomina OP – Adil

Odpowiedz

1
public class FileTest { 

    public static void matches(Path path, String glob){ 
     PathMatcher matcher = FileSystems.getDefault().getPathMatcher(glob); 
     System.out.println(matcher.matches(path)); 
    } 
    public static void main(String[] args) throws IOException { 
     Path path = Paths.get("/com/java/One.java"); 
     matches(path, "glob:*.java");  // regular expression that matches any file path that end with .java so it will return the value as true 
     matches(path, "glob:**/*.java"); // regular expression ** characters matches zero or more characters crossing directory boundaries so it will match complete path but if you put /* it will search for a path like this /com/java//one.java soe here it will not match the path and will return value as false. 
     matches(path, "glob:*"); // this will match any path and return value as true. 
     matches(path, "glob:**"); // this will complete path crossing directory so it will return you value as true. 

    } 
} 

W powyższym programie, gdy dzwonisz mecze ze ścieżką jak "/com/java/One.java" i GLOB wyrażenie regularne do wyszukiwania lub dopasowania ścieżkę funkcję będzie przyjmować wartości i przeprowadzić operację i zwraca wartość true lub false . wyjściowa:

true 
false 
true 
true 

Jeśli używasz platformy Windows to musisz zmodyfikować swój program w następujący sposób.

public class match { 

    public static void matches(Path path, String glob){ 
    PathMatcher matcher = FileSystems.getDefault().getPathMatcher(glob); 
    System.out.println(matcher.matches(path)); 
    } 
    public static void main(String[] args) throws IOException { 
    Path path = Paths.get("\\com\\java\\One.java"); 
    matches(path, "glob:*.java"); 
    matches(path, "glob:**\\*.java"); 
    matches(path, "glob:*"); 
    matches(path, "glob:**"); 

    } 
} 

Więcej szczegółów Click here

2
matches(path, "glob:*.java"); // => flase 

ponieważ ścieżka zawiera / które opisują hierarchii katalogów, *.java dopasowuje dowolną nazwę pliku z .java przedłużenie

matches(path, "glob:**/*.java"); // => true 

ponieważ ** pasuje dowolny ciąg, w tym pod-ścieżkę (np. /com/java/ w tobie XAMPLE)

matches(path, "glob:*"); // => false 

jak wspomniano w pierwszym, bo trzeba separator ścieżki /

matches(path, "glob:**"); // => true 

jak wspomniano w drugim, bo ** Dopasowuje dowolny ciąg znaków w tym /