Ce que je dois faire si Rechercher dans un dossier dit C:\example
J'ai ensuite besoin de parcourir chaque fichier et de vérifier s'il correspond à quelques caractères de début, donc si les fichiers démarrent
temp****.txt
tempONE.txt
tempTWO.txt
Donc, si le fichier commence par temp et porte une extension .txt, je voudrais ensuite mettre ce nom de fichier dans un File file = new File("C:/example/temp***.txt);
afin que je puisse ensuite le lire dans le fichier. se réunit comme ci-dessus.
Ce que vous voulez, c'est File.listFiles(FileNameFilter filter)
.
Cela vous donnera 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"));
Regardez Java.io.File.list()
et FilenameFilter
.
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, je voudrais montrer comment utiliser Java.io.FilenameFilter
pour rechercher un fichier dans le répertoire actuel et son 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 vous montrer comment utiliser recursive , bfs et dfs pour faire le travail.
Récursif :
/**
* 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();
}
Première recherche en profondeur :
/** * Recherchez autant que possible le long de chaque branche avant de revenir en arrière */ privé 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();
}
Apache commons IO divers
FilenameUtils.wildcardMatch
Voir Apache javadoc ici . Il correspond au caractère générique avec le nom du fichier. Vous pouvez donc utiliser cette méthode pour vos comparaisons.
Pour élaborer sur cette réponse , Apache IO Utils pourrait vous faire gagner du temps. Prenons l'exemple suivant qui recherchera de manière récursive un fichier portant un nom donné:
File file = FileUtils.listFiles(new File("the/desired/root/path"),
new NameFileFilter("filename.ext"),
FileFilterUtils.trueFileFilter()
).iterator().next();
Voir:
Vous donnez le nom de votre fichier, le chemin du répertoire dans lequel vous souhaitez effectuer la recherche et vous le laissez effectuer le travail.
private static String getPath(String drl, String whereIAm) {
File dir = new File(whereIAm); //StaticMethods.currentPath() + "\\src\\main\\resources\\" +
for(File e : dir.listFiles()) {
if(e.isFile() && e.getName().equals(drl)) {return e.getPath();}
if(e.isDirectory()) {
String idiot = getPath(drl, e.getPath());
if(idiot != null) {return idiot;}
}
}
return null;
}