Java >> Java tutorial >  >> Tag >> String

Find filer, der matcher jokertegnstrenge i Java

1. Oversigt

I denne øvelse lærer vi, hvordan du finder filer ved hjælp af jokertegnstrenge i Java.

2. Introduktion

I programmeringsområdet er glob et mønster med jokertegn, der matcher filnavne . Vi bruger glob-mønstre til at filtrere en liste over filnavne til vores eksempel. Vi bruger de populære jokertegn "*" og "?". Java har understøttet denne funktion siden Java SE 7.

Java har leveret getPathMatcher() metode i deres FilSystem klasse. Det kan tage enten et regulært udtryk (regex) eller et globmønster. Vi vil bruge glob-mønstre i dette eksempel på grund af det enkle at anvende jokertegn sammenlignet med regex.

Lad os se et eksempel på at bruge denne metode med et globmønster:

String pattern = "myCustomPattern";
PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:" + pattern);

Her er nogle eksempler på glob-mønstre i Java:

Glob Beskrivelse
*.java Matcher alle filer med filtypenavnet "java"
*.{java,class} Matcher alle filer med filtypenavne "java" eller "class"
*.* Matcher alle filer med et "." et sted i dens navn
???? Matcher alle filer med fire tegn i navnet
[test].docx Matcher alle filer med filnavnet 't', 'e', ​​'s' eller 't' og "docx" filtypenavnet
[0-4].csv Matcher alle filer med filnavnet '0', '1', '2', '3' eller '4' med filtypenavnet "csv"
C:\\temp\\* Matcher alle filer i mappen "C:\temp" på Windows-systemer
src/test/* Matcher alle filer i mappen "src/test/" på Unix-baserede systemer

3. Implementering

Lad os komme ind på detaljerne i implementeringen af ​​denne løsning. Der er to trin til at fuldføre denne opgave.

Først opretter vi en metode, der tager to argumenter – en rodmappe til at søge i og et jokertegnsmønster at lede efter. Denne metode ville indeholde programmeringslogikken til at besøge hver fil og mappe, bruge glob-mønstre og til sidst returnere en liste over matchende filnavne.

For det andet bruger vi walkFileTree metode fra de Java-leverede Filer klasse for at påberåbe vores søgeproces.

Lad os starte med at oprette vores SearchFileByWildcard klasse med en searchWithWc() metode, som tager en sti og streng mønster som parametre:

class SearchFileByWildcard {
    static List<String> matchesList = new ArrayList<String>();
    List<String> searchWithWc(Path rootDir, String pattern) throws IOException {
        matchesList.clear();
        FileVisitor<Path> matcherVisitor = new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attribs) throws IOException {
                FileSystem fs = FileSystems.getDefault();
                PathMatcher matcher = fs.getPathMatcher(pattern);
                Path name = file.getFileName();
                if (matcher.matches(name)) {
                    matchesList.add(name.toString);
                }
	        return FileVisitResult.CONTINUE;
            }
        };
        Files.walkFileTree(rootDir, matcherVisitor);
        return matchesList;
    }
}

For at besøge filerne i rootDir , bruger vi FileVisitor interface. Når vi først har fået en grænseflade til filsystemet ved at kalde getDefault() metoden, bruger vi getPathMatcher() metode fra Filsystemet klasse. Det er her, vi anvender glob-mønstre på de individuelle filstier i rootDir .

I vores tilfælde kan vi bruge den resulterende PathMatcher for at få en ArrayList af matchende filnavne.

Til sidst kalder vi walkFileTree metode fra NIO Filer klasse. Filgennemgang starter ved rootDir , og hver knude i træet besøges rekursivt på en dybde-først måde. matcherVisitor indeholder en implementering for visitFile metode fra SimpleFileVisitor klasse.

Nu hvor vi har diskuteret implementering af en jokertegn-baseret filsøgning, lad os se på nogle eksempler på output. Vi bruger følgende filstruktur til vores eksempler:

Hvis vi sender en streng med "glob:*.{txt,docx}" mønster, udsender vores kode de tre filnavne med filtypenavnet “txt” og ét filnavn med filtypenavnet “docx” :

SearchFileByWildcard sfbw = new SearchFileByWildcard();
List<String> actual = sfbw.searchWithWc(Paths.get("src/test/resources/sfbw"), "glob:*.{txt,docx}");

assertEquals(new HashSet<>(Arrays.asList("six.txt", "three.txt", "two.docx", "one.txt")), 
  new HashSet<>(actual));

Hvis vi sender en streng med "glob:????.{csv}" mønster, udsender vores kode et filnavn med fire tegn efterfulgt af et "." med udvidelsen “csv” :

SearchFileByWildcard sfbw = new SearchFileByWildcard();
List<String> actual = sfbw.searchWithWc(Paths.get("src/test/resources/sfbw"), "glob:????.{csv}");

assertEquals(new HashSet<>(Arrays.asList("five.csv")), new HashSet<>(actual));

4. Konklusion

I dette selvstudie lærte vi, hvordan man søger efter filer ved hjælp af jokertegnmønstre i Java.

Kildekoden er tilgængelig på GitHub.


Java tag