我有一个方法,它以String
参数作为根目录,我想为所有子文件夹保存文件的名称和路径。
FileObject
只是一个包含两个String
变量的类 - name
和path
。
private static List<FileObject> getAllFilePaths(String rootDir, List<FileObject> helper) {
File directory = new File(rootDir);
System.out.println("rootDir: "+rootDir);
FileObject fo=new FileObject();
//get all files and directories
File[] allFiles = directory.listFiles();
for (File file : allFiles) {
if (file.isFile()) {
System.out.println("If file: "+file.getName());
//if it's a file add it to results
fo.setPath(file.getAbsolutePath());
fo.setName(file.getName());
helper.add(fo);
} else if (file.isDirectory()) {
System.out.println("else if: "+file.getName());
//is it's a directory do the method again and add to to results
//fo.setPath(file.getAbsolutePath());
//fo.setName(file.getName());
//results.add(fo);
getAllFilePaths(file.getAbsolutePath(),helper);
}
}
return helper;
}
我尝试了许多不同的方法来实现此方法,但返回的List是错误的。我该如何正确地做到这一点?
答案 0 :(得分:3)
您只是创建FileObject
的一个实例,只是一遍又一遍地将其添加到列表中。尽管使用setter方法(如setName()
和setPath()
)来修改其属性,但 not 将为您提供您期望的结果。
Java在将对象添加到集合/数据结构时不会复制该对象。因此,通过调用set...()
循环中的for
方法,您将改变已添加到列表中的现有实例。
尝试将FileObject
的实例化移动到循环中:
private static List<FileObject> getAllFilePaths(String rootDir, List<FileObject> helper) {
File directory = new File(rootDir);
System.out.println("rootDir: "+rootDir);
//get all files and directories
File[] allFiles = directory.listFiles();
for (File file : allFiles) {
if (file.isFile()) {
System.out.println("If file: "+file.getName());
//if it's a file add it to results
FileObject fo=new FileObject(); // < Instantiate the FileObject here
fo.setPath(file.getAbsolutePath());
fo.setName(file.getName());
helper.add(fo);
} else if (file.isDirectory()) {
System.out.println("else if: "+file.getName());
//is it's a directory do the method again and add to to results
//fo.setPath(file.getAbsolutePath());
//fo.setName(file.getName());
//results.add(fo);
getAllFilePaths(file.getAbsolutePath(),helper);
}
}
return helper;
}