Java – 搜索目录中的文件

这应该是简单的,但我无法得到它 – “编写一个程序来搜索给定目录中的特定文件名。” 我找到了一些硬编码文件名和目录的例子,但是我需要用户输入的dir和文件名。

public static void main(String[] args) { String fileName = args[0]; // For the filename declaration String directory; boolean found; File dir = new File(directory); File[] matchingFiles = dir.listFiles(new FilenameFilter() { public boolean accept(File dir, String fileName) { return true; } }); } 

你可以尝试这样的事情:

 import java.io.*; import java.util.*; class FindFile { public void findFile(String name,File file) { File[] list = file.listFiles(); if(list!=null) for (File fil : list) { if (fil.isDirectory()) { findFile(name,fil); } else if (name.equalsIgnoreCase(fil.getName())) { System.out.println(fil.getParentFile()); } } } public static void main(String[] args) { FindFile ff = new FindFile(); Scanner scan = new Scanner(System.in); System.out.println("Enter the file to be searched.. " ); String name = scan.next(); System.out.println("Enter the directory where to search "); String directory = scan.next(); ff.findFile(name,new File(directory)); } } 

这是输出:

 J:\Java\misc\load>java FindFile Enter the file to be searched.. FindFile.java Enter the directory where to search j:\java\ FindFile.java Found in->j:\java\misc\load 

这看起来像是一个家庭作业问题,所以我只想给你一些指示:

尝试给出好的独特变量名称。 这里首先使用“fileName”作为目录,然后使用文件。 这很令人困惑,也无法帮助您解决问题。 为不同的事物使用不同的名称。

你没有使用Scanner做任何事情,这里不需要它,摆脱它。

此外,accept方法应返回一个布尔值。 现在,您正在尝试返回String。 Boolean表示它应该返回true或false。 例如, return a > 0; 可能会返回true或false,具体取决于a的值。 但是return fileName; 将只返回fileName的值,这是一个String。

如果要使用动态文件名filter,可以实现FilenameFilter并将构造函数传递给动态名称。

当然,这意味着你必须在每次类(开销)时实例化,但它的工作原理

例:

 public class DynamicFileNameFilter implements FilenameFilter { private String comparingname; public DynamicFileNameFilter(String comparingName){ this.comparingname = comparingName; } @Override public boolean accept(File dir, String name) { File file = new File(name); if (name.equals(comparingname) && !file.isDirectory()) return false; else return true; } } 

然后你在你需要的地方使用:

 FilenameFilter fileNameFilter = new DynamicFileNameFilter("thedynamicNameorpatternYouAreSearchinfor"); File[] matchingFiles = dir.listFiles(fileNameFilter); 

使用** Java 8 *,有一种使用流和lambda的替代方法:

 public static void recursiveFind(Path path, Consumer c) { try (DirectoryStream newDirectoryStream = Files.newDirectoryStream(path)) { StreamSupport.stream(newDirectoryStream.spliterator(), false) .peek(p -> { c.accept(p); if (p.toFile() .isDirectory()) { recursiveFind(p, c); } }) .collect(Collectors.toList()); } catch (IOException e) { e.printStackTrace(); } } 

所以这将以递归方式打印所有文件:

 recursiveFind(Paths.get("."), System.out::println); 

这将搜索一个文件:

 recursiveFind(Paths.get("."), p -> { if (p.toFile().getName().toString().equals("src")) { System.out.println(p); } }); 

我使用了一种不同的方法来搜索使用堆栈的文件..请记住,文件夹中可能有文件夹。 虽然它不比Windows搜索快(虽然我没想到)但它肯定会给出正确的结果。 请根据需要修改代码。 此代码最初用于提取某些文件扩展名的文件路径:)。 随意优化。

 import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * @author Deepankar Sinha */ public class GetList { public List stack; static List lnkFile; static List progName; int index=-1; public static void main(String args[]) throws IOException { //var-- progFile:Location of the file to be search. String progFile="C:\\"; GetList obj=new GetList(); String temp=progFile; int i; while(!"&%@#".equals(temp)) { File dir=new File(temp); String[] directory=dir.list(); if(directory!=null){ for(String name: directory) { if(new File(temp+name).isDirectory()) obj.push(temp+name+"\\"); else if(new File(temp+name).isFile()) { try{ //".exe can be replaced with file name to be searched. Just exclude name.substring()... you know what to do.:) if(".exe".equals(name.substring(name.lastIndexOf('.'), name.length()))) { //obj.addFile(temp+name,name); System.out.println(temp+name); } }catch(StringIndexOutOfBoundsException e) { //debug purpose System.out.println("ERROR******"+temp+name); } } }} temp=obj.pop(); } obj.display(); // for(int i=0;i(); this.lnkFile=new ArrayList<>(); this.progName=new ArrayList<>(); } public void push(String dir) { index++; //System.out.println("PUSH : "+dir+" "+index); this.stack.add(index,dir); } public String pop() { String dir=""; if(index==-1) return "&%@#"; else { dir=this.stack.get(index); //System.out.println("POP : "+dir+" "+index); index--; } return dir; } public void addFile(String name,String name2) { lnkFile.add(name); progName.add(name2); } public void display() { GetList.lnkFile.stream().forEach((lnkFile1) -> { System.out.println(lnkFile1); }); } } 

以下代码有助于在目录中搜索文件并打开其位置

 import java.io.*; import java.util.*; import java.awt.Desktop; public class Filesearch2 { public static void main(String[] args)throws IOException { Filesearch2 fs = new Filesearch2(); Scanner scan = new Scanner(System.in); System.out.println("Enter the file to be searched.. " ); String name = scan.next(); System.out.println("Enter the directory where to search "); String directory = scan.next(); fs.findFile(name,new File(directory)); } public void findFile(String name,File file1)throws IOException { File[] list = file1.listFiles(); if(list!=null) { for(File file2 : list) { if (file2.isDirectory()) { findFile(name,file2); } else if (name.equalsIgnoreCase(file2.getName())) { System.out.println("Found"); System.out.println("File found at : "+file2.getParentFile()); System.out.println("Path diectory: "+file2.getAbsolutePath()); String p1 = ""+file2.getParentFile(); File f2 = new File(p1); Desktop.getDesktop().open(f2); } } } } }