我想让我的程序打印出我计算机上所有文件的大量列表。我的问题是它只打印第一个硬盘驱动器的第一个文件夹中的文件,当我想要它打印我的计算机上的所有文件。我有什么想法在这里做错了吗?感谢。
以下是我使用的代码:
主:
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
ArrayList<File> roots = new ArrayList();
roots.addAll(Arrays.asList(File.listRoots()));
for (File file : roots) {
new Searcher(file.toString().replace('\\', '/')).search();
}
}
}
和Searcher课程:
import java.io.File;
public class Searcher {
private String root;
public Searcher(String root) {
this.root = root;
}
public void search() {
System.out.println(root);
File folder = new File(root);
File[] listOfFiles = folder.listFiles();
for (File file : listOfFiles) {
String path = file.getPath().replace('\\', '/');
System.out.println(path);
if (!path.contains(".")) {
new Searcher(path + "/").search();
}
}
}
}
答案 0 :(得分:6)
我刚试过这个,它对我有用。我确实必须添加一个null
检查并更改了目录评估方法:
package test;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
public class Searcher {
public static void main(String[] args) {
ArrayList<File> roots = new ArrayList<File>();
roots.addAll(Arrays.asList(File.listRoots()));
for (File file : roots) {
new Searcher(file.toString().replace('\\', '/')).search();
}
}
private String root;
public Searcher(String root) {
this.root = root;
}
public void search() {
System.out.println(root);
File folder = new File(root);
File[] listOfFiles = folder.listFiles();
if(listOfFiles == null) return; // Added condition check
for (File file : listOfFiles) {
String path = file.getPath().replace('\\', '/');
System.out.println(path);
if (file.isDirectory()) {
new Searcher(path + "/").search();
}
}
}
}
答案 1 :(得分:2)
您应该像这样更新搜索方法:
public void search() {
System.out.println(root);
File folder = new File(root);
File[] listOfFiles = folder.listFiles();
for (File file : listOfFiles) {
String path = file.getPath().replace('\\', '/');
System.out.println(path);
if (file.isDirectory()) {
new Searcher(path + "/").search();
}
}
}
答案 2 :(得分:1)
如果选择Java 7,请查看walkFileTree() method。它允许您访问树中的所有文件和目录,您可以从驱动器的根目录开始。只需实施基本FileVisitor
即可处理每个Path
的文件属性。您可以开始使用here。
答案 3 :(得分:1)
如果您使用的是Java SE 7,请使用新文件API:
http://docs.oracle.com/javase/7/docs/api/java/nio/file/FileVisitor.html
答案 4 :(得分:0)
我不知道你得到了什么错误,但我得到了一个NPE,因为你没有在下一行之后检查null。
File[] listOfFiles = folder.listFiles();
更改代码后,它似乎运行良好,我停止它,因为我有很多文件。我假设它将继续在第一个根之后的下一个根(c:/在我的情况下)
import java.io.File;
import java.util.ArrayList; import java.util.Arrays;
公共类搜索{
public static void main(String[] args) {
ArrayList<File> roots = new ArrayList();
roots.addAll(Arrays.asList(File.listRoots()));
for (File file : roots) {
System.out.println(file.toString());
new Searcher(file.toString().replace('\\', '/')).search();
}
}
}
班级搜寻者{
private String root;
public Searcher(String root) {
this.root = root;
}
public void search() {
System.out.println(root);
File folder = new File(root);
File[] listOfFiles = folder.listFiles();
if(listOfFiles!=null)
{
for (File file : listOfFiles) {
String path = file.getPath().replace('\\', '/');
System.out.println(path);
if (!path.contains(".")) {
new Searcher(path + "/").search();
}
}
}
}
}