2013-09-10 5 views
33

Непосредственно из this Java Oracle учебника:Когда использовать ** (двойную звезду) в синтаксисе Глобы в JAVA

Две звездочки **, работает как *, но пересекают границы каталога. Этот синтаксис обычно используется для согласования полных путей.

Может ли кто-нибудь сделать настоящий пример из этого? Что они означают с «границей границ кросс»? Пересекая границу каталога, я представляю себе что-то вроде проверки файла с корня на getNameCount()-1. Опять настоящий пример, объясняющий разницу между * и ** в практике будет замечательным.

+0

Это означает, что он будет рекурсивно проходить через все подкаталоги, где * будет захватывать только файлы из текущего каталога, игнорируя подкаталоги – StormeHawke

ответ

49

Javadoc для FileSystem#getPathMatcher() имеет некоторые довольно хорошие примеры и объяснения

*.java Matches a path that represents a file name ending in .java 
*.* Matches file names containing a dot 

*.{java,class} Matches file names ending with .java or .class 
foo.?   Matches file names starting with foo. and a single character extension 
/home/*/*  Matches /home/gus/data on UNIX platforms 
/home/**  Matches /home/gus and /home/gus/data on UNIX platforms 
C:\\*   Matches C:\foo and C:\bar on the Windows platform (note that the backslash is escaped; as a string literal in the Java Language the pattern would be "C:\\\\*") 

Так /home/** будет соответствовать /home/gus/data, но /home/* не будет.

/home/* говорит каждый файл непосредственно в каталоге /home.

/home/** говорит каждый файл в любом каталоге внутри /home.


Пример * против **. Предполагая, что ваш текущий рабочий каталог равен /Users/username/workspace/myproject, то следующее будет соответствовать только файлу (директории) ./myproject.

PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher("glob:/Users/username/workspace/*"); 
Files.walk(Paths.get(".")).forEach((path) -> { 
    path = path.toAbsolutePath().normalize(); 
    System.out.print("Path: " + path + " "); 
    if (pathMatcher.matches(path)) { 
     System.out.print("matched"); 
    } 
    System.out.println(); 
}); 

Если вы используете **, это будет соответствовать все папки и файлы в этой папке.

+1

. Этот API, похоже, достаточно хорошо описывает синтаксис glob. Спасибо, я искал некоторые спецификации glob и не нашел их. Еще раз спасибо – Rollerball

+0

@Rollerball Добро пожаловать. Класс 'PathMatcher', похоже, сильно использует синтаксис glob, поэтому вам может быть больше удачи, глядя на связанные методы и классы. –

+0

@Sotirios Delimanolis, пожалуйста, укажите пример кода и структуру файла, когда glob: ** и glob: * вернет другой результат. – gstackoverflow

 Смежные вопросы

  • Нет связанных вопросов^_^