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); } } } } }