Java 在整个c驱动器中搜索文件类型
好的,我的程序的一部分在C盘上搜索所有的mp3文件,唯一的问题是它不会进入和子文件夹。这是到目前为止我的代码Java 在整个c驱动器中搜索文件类型,java,file,io,Java,File,Io,好的,我的程序的一部分在C盘上搜索所有的mp3文件,唯一的问题是它不会进入和子文件夹。这是到目前为止我的代码 public static List<String> ListFiles() { List<String> files = new ArrayList<String>(); File folder = new File("C:/"); File[] listOfFiles = folder.listFiles(); for (
public static List<String> ListFiles() {
List<String> files = new ArrayList<String>();
File folder = new File("C:/");
File[] listOfFiles = folder.listFiles();
for (File file : listOfFiles) {
if (file.isFile() && file.toString().contains(".mp3")) {
String fileS = file.getName();
files.add(fileS);
}
}
return files;
}
公共静态列表列表文件(){
列表文件=新的ArrayList();
文件夹=新文件(“C:/”);
File[]listOfFiles=folder.listFiles();
对于(文件:listOfFiles){
如果(file.isFile()&&file.toString()包含(“.mp3”)){
String fileS=file.getName();
文件。添加(文件);
}
}
归还文件;
}
测试文件是否为文件夹。如果是,则将其传递到列表文件
,并将返回值附加到文件
为此,您需要更改ListFiles
以接受File
对象作为参数,并使用此文件开始搜索,而不是使用“C:/”查看DirectoryStream
类和Files.isDirectory()
方法。基本上,您要做的是检查每个路径是文件还是目录
如果它是目录,则再次调用方法。否则,继续迭代
也可以使用目录流进行全局绑定。为您节省了大量时间,而无需手动检查文件扩展名
如果希望继续使用方法或目录流,则需要对程序进行一些修改以适应递归。尝试递归方法。路径是您所在的当前目录。递归地调用每个文件夹,您将访问每个文件
public void walk(String path) {
File root = new File(path);
File[] list = root.listFiles();
if (list == null) return;
for (File f : list) {
if (f.isDirectory()) {
walk(f.getAbsolutePath());
}
else {
//do what you want with files
}
}
}
如果你想自己做这件事,你需要让它递归。这就是奥斯瓦尔德的意思。递归方法是一种调用自身的方法。因此,当您搜索文件夹时,对于其中的每个元素,如果是mp3,请将其添加到列表中,如果是文件夹,请再次调用您的方法,将该文件夹作为输入传入。我知道这是Java问题,但为什么不使用Groovy并像这样做:
static List<String> listMp3s() {
List<String> files = []
File rootFolder = new File('C:/')
rootFolder.eachFileRecurse(FileType.FILES) {
if (it.name.endsWith('.mp3')) {
files << it.name
}
}
return files
}
静态列表列表mp3s(){
列出文件=[]
File rootFolder=新文件('C:/'))
rootFolder.eachFileRecurse(FileType.FILES){
if(it.name.endsWith('.mp3')){
文件与其对格式感到抱歉,不如修复格式。您需要迭代或递归解决方案。如果找到的文件是文件夹,请递归调用自己。或者(在某些方面稍微好一点)将文件夹添加到要检查的文件夹列表中。