Introducció
Moltes aplicacions manegen arxius d’alguna manera i la manipulació d’arxius és un dels coneixements bàsics en qualsevol llenguatge de programació.
Per manipular arxius, ens cal saber on estan ubicats. Tenir una descripció general dels arxius en un directori és primordial si volem aconseguir això, especialment si podem realitzar operacions en ells a través de la iteració. Hi ha diverses maneres de fer això en Java, que mostrarem al llarg d’aquest article.
En nom de la simplicitat, tots els exemples s’han d’escriure per al següent arbre de fitxers:
Programming|-- minimax.c|-- super_hack.py|-- TODO.txt`-- CodingMusic |-- Girl Talk - All Day.mp3 |-- Celldweller - Frozen.mp3 |-- Lim Taylor - Isn't It Wonderful.mp3 `-- Radiohead - Everything in Its Right Place.mp3
File.list ()
el mètode més simple per llistar els noms d’arxius i carpetes en un directori donat, sense travessar els subdirectoris, és el mètode auxiliar . .list()
, que retorna una matriu de String
s.
Fem això usant el .list()
mètode en un File
exemple:
public class Pathnames { public static void main(String args) { // Creates an array in which we will store the names of files and directories String pathnames; // Creates a new File instance by converting the given pathname string // into an abstract pathname File f = new File("D:/Programming"); // Populates the array with names of files and directories pathnames = f.list(); // For each pathname in the pathnames array for (String pathname : pathnames) { // Print the names of files and directories System.out.println(pathname); } }}
Usant un simple bucle for-each, iterem a través de la matriu i imprimim el String
s.
CodingMusicminimax.csuper_hack.pyTODO.txt
Amb aquest enfocament, tots els elements de l’CodingMusic
directori no es mostren, i un desavantatge d’aquest enfocament és que realment no podem fer res amb els arxius en si. Només estem obtenint els seus noms. És útil quan només volem fer una ullada als arxius a el peu de la lletra.
FilenameFilter
Una altra cosa que podem fer amb el .list()
El mètode és crear un FilenameFilter
per tornar només els arxius que volem:
File f = new File("D:/Programming");// This filter will only include files ending with .pyFilenameFilter filter = new FilenameFilter() { @Override public boolean accept(File f, String name) { return name.endsWith(".py"); } };// This is how to apply the filterpathnames = f.list(filter);
Executar aquest fragment de codi produiria:
super_hack.py
File.listFiles ()
Similar a mètode anterior, aquest es pot usar per tornar els noms d’arxius i directoris , però aquesta vegada els obtenim com una matriu de File
objectes, el que ens dóna la possibilitat de manipular-los directament:
public class Pathnames { public static void main(String args) { // try-catch block to handle exceptions try { File f = new File("D:/Programming"); FilenameFilter filter = new FilenameFilter() { @Override public boolean accept(File f, String name) { // We want to find only .c files return name.endsWith(".c"); } }; // Note that this time we are using a File class as an array, // instead of String File files = f.listFiles(filter); // Get the names of the files by using the .getName() method for (int i = 0; i < files.length; i++) { System.out.println(files.getName()); } } catch (Exception e) { System.err.println(e.getMessage()); } }}
Sortida:
minimax.c
Ara, aprofundim en el sistema de fitxers mitjançant la recursivitat i alguns mètodes més per utilitzar en el File
objecte:
public class ListFilesRecursively { public void listFiles(String startDir) { File dir = new File(startDir); File files = dir.listFiles(); if (files != null && files.length > 0) { for (File file : files) { // Check if the file is a directory if (file.isDirectory()) { // We will not print the directory name, just use it as a new // starting point to list files from listDirectory(file.getAbsolutePath()); } else { // We can use .length() to get the file size System.out.println(file.getName() + " (size in bytes: " + file.length()+")"); } } } } public static void main(String args) { ListFilesRecursively test = new ListFilesRecursively(); String startDir = ("D:/Programming"); test.listFiles(startDir); }}
Sortida:
Girl Talk - All Day.mp3 (size in bytes: 8017524)Celldweller - Frozen.mp3 (size in bytes: 12651325)Lim Taylor - Isn't It Wonderful.mp3 (size in bytes: 6352489)Radiohead - Everything in Its Right Place.mp3 (size in bytes: 170876098)minimax.c (size in bytes: 20662)super_hack.py (size in bytes: 114401)TODO.txt (size in bytes: 998)
Files.walk ()
En Java 8 i posteriors res podem fer servir el java.nio.file.Files
classe per poblar una Stream
i utilitzi-per recórrer arxius i directoris i, a el mateix temps, recórrer de forma recursiva tots els subdirectoris.
Tingueu en compte que en aquest exemple farem servir expressions Lambda:
public class FilesWalk { public static void main(String args) { try (Stream<Path> walk = Files.walk(Paths.get("D:/Programming"))) { // We want to find only regular files List<String> result = walk.filter(Files::isRegularFile) .map(x -> x.toString()).collect(Collectors.toList()); result.forEach(System.out::println); } catch (IOException e) { e.printStackTrace(); } }}
Aquí, hem poblat un Stream
utilitzant el .walk()
mètode, passant una Paths
argument. els Paths
La classe consta de mètodes estàtics que retornen un Path
basat en un URI de cadena i fent servir un Path
, podem localitzar l’arxiu fàcilment.
els Path
, Paths
, Files
, i moltes altres classes pertanyen a la java.nio
package, que es va introduir en Java 7 com una forma més moderna de representar arxius sense bloqueig.
Després, utilitzant el marc de col·leccions, es genera una llista.
Executar aquest fragment de codi produirà:
D:ProgrammingCoding MusicRadiohead - Everything in Its Right Place.mp3D:ProgrammingCoding MusicLim Taylor - Isn't It Wonderful.mp3D:ProgrammingCoding MusicCelldweller - Frozen.mp3D:ProgrammingCoding MusicGirl Talk - All Day.mp3D:Programmingminimax.cD:Programmingsuper_hack.pyD:ProgrammingTODO.txt
conclusió
el maneig d’arxius d’alguna manera és una tasca central per a la majoria dels llenguatges de programació, i això inclou la capacitat de llistar i trobar arxius en el sistema d’arxius. Per manipular arxius, necessitem saber on estan ubicats. Tenir una descripció general dels arxius en un directori és primordial si volem aconseguir això, especialment si podem realitzar operacions en ells a través de la iteració.
En aquest article mostrem diverses formes diferents en Java de llistar arxius en el sistema d’arxius, utilitzant enfocaments tant lineals com recursius.