JAVA 搜索目录下符合条件的文件
发布网友
发布时间:2022-04-23 03:17
我来回答
共3个回答
热心网友
时间:2023-10-13 02:53
不是因为搜索量太大,而多半是因为权限问题。具体函数是listFiles。函数说明了,如果遇到IO错误将返回null,而你的报错是处理null,所以你这里肯定是遇到了IO错误。之前能用isDirectory,不大可能是磁盘错误或者逻辑错误,就只剩下权限问题了。Win下有好些目录是没有列表权限的,原因是那些目录本身是为了兼容老版本的Win而存在的目录链接;存在的意义在于可以通过老版本Win访问文件的方式来访问新版本Win里的文件,因为是目录链接,所以文件实际在新目录里;而老版本目录不让列举文件的原因是如果允许列举,遇到像你这样的搜索,处在新目录里的文件就会被找到两次(通过旧目录链接和通过新目录直接找到)。还有回收站相关的文件和System Volume Information目录相关的也有很多默认不能打开的目录,因为这些不是普通的用户文件。
所以处理一下listFiles的结果就行了。输出不能访问的提示。至于搜索量,报错也是ArrayIndexOutOfBoundsException或者StackOverflowError,所以直接输出别先保存在数组里吧,这样也让不能访问而报错时的输出连续一点。Pattern先compile在matcher可以提高效率。
import java.io.File;
import java.util.regex.Pattern;
public class Search {
public static void search(File folder, Pattern regex) {
File[] files = folder.listFiles();
if (files == null) {
System.err.println("不能访问" + folder.getAbsolutePath());
return;
}
for(File file : files) {
if(file.isDirectory()) {
search(file, regex);
} else {
if (regex.matcher(file.getName()).matches()) {
System.out.println(file.getAbsolutePath());
}
}
}
}
public static void search(String path, String regex) {
search(new File(path), Pattern.compile(regex));
}
public static void main(String[] args) {
Search.search("C:\\Users", ".*\\.mp3");
}
}
热心网友
时间:2023-10-13 02:54
public class SearcFile {
public List<File> list=new ArrayList<File>();
public void doSearch(File f,String regex){
File[] f1=f.listFiles();
for(File ff: f1){
if(ff.isDirectory()){
doSearch(ff,regex);
}else if(ff.getName().matches(regex)){
list.add(ff);
}
}
}
public void display(){
for(File f:list){
System.out.println(f.getAbsolutePath());
}
}
public static void main(String[] asd){
SearcFile search = new SearcFile();
search.doSearch(new File("D:\\temp\\"), ".*\\.mp3");
search.display();
}
}追问这个问题还是一样啊 我的目的是搜索整个E:盘中含有 mp3后缀的文件
但是search.doSearch(new File("D:\\temp\\"), ".*\\.mp3");这个还是只能搜索比较小的文件
搜索整个 D: 还是会出现
Exception in thread "main" java.lang.NullPointerException
热心网友
时间:2023-10-13 02:54
这个错误是空指针一场!