Trouver des fichiers dans un dossier en utilisant Java
Ce que je dois faire si la Recherche d'un dossier de dire C:example
je dois ensuite passer en revue chaque fichier et vérifier s'il correspond à quelques caractères de départ donc si les fichiers commencent
temp****.txt
tempONE.txt
tempTWO.txt
donc si le fichier commence avec temp et a une extension .txt je voudrais alors mettre ce nom de fichier dans un File file = new File("C:/example/temp***.txt);
donc je peux alors lire dans le fichier, la boucle doit alors passer dans le fichier suivant pour vérifier si elle se rencontre comme ci-dessus.
9 réponses
Ce que vous voulez, c'est File.listFiles(FileNameFilter filter)
.
Qui va vous donner une liste des fichiers dans le répertoire que vous voulez qui correspondent à un certain filtre.
le code ressemblera à:
// your directory
File f = new File("C:\example");
File[] matchingFiles = f.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.startsWith("temp") && name.endsWith("txt");
}
});
Vous pouvez utiliser un FilenameFilter, comme ceci:
File dir = new File(directory);
File[] matches = dir.listFiles(new FilenameFilter()
{
public boolean accept(File dir, String name)
{
return name.startsWith("temp") && name.endsWith(".txt");
}
});
je sais, c'est une vieille question. Mais juste pour être complet, la version lambda.
File dir = new File(directory);
File[] files = dir.listFiles((dir1, name) -> name.startsWith("temp") && name.endsWith(".txt"));
Envisager de Apache Commons IO, il a une classe appelée FileUtils qui a un listFiles
méthode qui pourrait être très utile dans votre cas.
pour lister les fichiers Json de votre répertoire donné.
import java.io.File;
import java.io.FilenameFilter;
public class ListOutFilesInDir {
public static void main(String[] args) throws Exception {
File[] fileList = getFileList("directory path");
for(File file : fileList) {
System.out.println(file.getName());
}
}
private static File[] getFileList(String dirPath) {
File dir = new File(dirPath);
File[] fileList = dir.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".json");
}
});
return fileList;
}
}
comme @Clarke l'a dit, Vous pouvez utiliser java.io.FilenameFilter
pour filtrer le fichier par condition spécifique.
en complément, j'aimerais vous montrer comment utiliser java.io.FilenameFilter
pour rechercher le fichier dans le répertoire courant et ses sous-répertoire.
les méthodes courantes getTargetFiles et printFiles sont utilisées pour rechercher des fichiers et les imprimer.
public class SearchFiles {
//It's used in dfs
private Map<String, Boolean> map = new HashMap<String, Boolean>();
private File root;
public SearchFiles(File root){
this.root = root;
}
/**
* List eligible files on current path
* @param directory
* The directory to be searched
* @return
* Eligible files
*/
private String[] getTargetFiles(File directory){
if(directory == null){
return null;
}
String[] files = directory.list(new FilenameFilter(){
@Override
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub
return name.startsWith("Temp") && name.endsWith(".txt");
}
});
return files;
}
/**
* Print all eligible files
*/
private void printFiles(String[] targets){
for(String target: targets){
System.out.println(target);
}
}
}
je vais démo comment utiliser récursive, bfs et dfs pour obtenir le travail faire.
Récursive:
/**
* How many files in the parent directory and its subdirectory <br>
* depends on how many files in each subdirectory and their subdirectory
*/
private void recursive(File path){
printFiles(getTargetFiles(path));
for(File file: path.listFiles()){
if(file.isDirectory()){
recursive(file);
}
}
if(path.isDirectory()){
printFiles(getTargetFiles(path));
}
}
public static void main(String args[]){
SearchFiles searcher = new SearchFiles(new File("C:\example"));
searcher.recursive(searcher.root);
}
Largeur Première Recherche:
/**
* Search the node's neighbors firstly before moving to the next level neighbors
*/
private void bfs(){
if(root == null){
return;
}
Queue<File> queue = new LinkedList<File>();
queue.add(root);
while(!queue.isEmpty()){
File node = queue.remove();
printFiles(getTargetFiles(node));
File[] childs = node.listFiles(new FileFilter(){
@Override
public boolean accept(File pathname) {
// TODO Auto-generated method stub
if(pathname.isDirectory())
return true;
return false;
}
});
if(childs != null){
for(File child: childs){
queue.add(child);
}
}
}
}
public static void main(String args[]){
SearchFiles searcher = new SearchFiles(new File("C:\example"));
searcher.bfs();
}
Profondeur Première Recherche:
/** * Recherche autant que possible le long de chaque branche avant de mandature */ private void dfs(){
if(root == null){
return;
}
Stack<File> stack = new Stack<File>();
stack.push(root);
map.put(root.getAbsolutePath(), true);
while(!stack.isEmpty()){
File node = stack.peek();
File child = getUnvisitedChild(node);
if(child != null){
stack.push(child);
printFiles(getTargetFiles(child));
map.put(child.getAbsolutePath(), true);
}else{
stack.pop();
}
}
}
/**
* Get unvisited node of the node
*
*/
private File getUnvisitedChild(File node){
File[] childs = node.listFiles(new FileFilter(){
@Override
public boolean accept(File pathname) {
// TODO Auto-generated method stub
if(pathname.isDirectory())
return true;
return false;
}
});
if(childs == null){
return null;
}
for(File child: childs){
if(map.containsKey(child.getAbsolutePath()) == false){
map.put(child.getAbsolutePath(), false);
}
if(map.get(child.getAbsolutePath()) == false){
return child;
}
}
return null;
}
public static void main(String args[]){
SearchFiles searcher = new SearchFiles(new File("C:\example"));
searcher.dfs();
}
pour développer sur cette réponse, Apache pourrait vous faire gagner du temps. Considérez l'exemple suivant qui va rechercher récursivement un fichier d'un nom:
File file = FileUtils.listFiles(new File("the/desired/root/path"),
new NameFileFilter("filename.ext"),
FileFilterUtils.trueFileFilter()
).iterator().next();
Voir:
- org.apache.commons.io.FileUtils
- org.apache.commons.io.filefilter.FileFilterUtils
- https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/filefilter/IOFileFilter.html