gpt4 book ai didi

java - 搜索大目录中的多个文件夹 - JAVA

转载 作者:太空宇宙 更新时间:2023-11-04 13:11:13 25 4
gpt4 key购买 nike

我希望能够搜索一个大目录,包括名为“online”的每个文件夹的所有子文件夹,并将找到的文件夹添加到列表中。

换句话说:这个文件是一个文件夹吗?如果不忽略,如果是,这个文件夹是否称为“在线”?,如果是,则添加到列表,如果不打开并循环浏览文件夹内容并重新开始。

我有一个脚本:

String fileType = "online";

private void buildList(File aFile) {
if (aFile.isDirectory()) {

if (fileName.contains(fileType)) {
addToList(aFile);
} else {
for (File bFile : aFile.listFiles()) {
buildList(bFile);
}
}
}
}

这适用于小目录,但不适用于大目录,因为它打开了大量数组。它挂起并耗尽所有内存。

我愿意接受所有建议。仅限 JAVA,最好兼容 JDK1.6。提前非常感谢!!!!

编辑:

static long counter = 0L;
ArrayList<File> opFolders;


public final class DirectoryCollectorVisitor extends SimpleFileVisitor<Path> {

private final List<Path> list;



public DirectoryCollectorVisitor(final List<Path> list) {


this.list = list;
}

@Override
public FileVisitResult preVisitDirectory(final Path path, final BasicFileAttributes attrs) {
counterPrintField.setText("" + counter++);
if (path.getFileName().toString().contains("online")) {
list.add(path);
File aFile = path.toFile();
opFolders.add(aFile);
}
return FileVisitResult.CONTINUE;
}
}



private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {

JFileChooser chooser = jFileChooser1;
chooser.setCurrentDirectory(new java.io.File("O:\\Prod\\Clients"));
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
chooser.setAcceptAllFileFilterUsed(false);
int returnVal = chooser.showOpenDialog(this);

if (returnVal == chooser.APPROVE_OPTION) {
File file = chooser.getSelectedFile();
try {
jTextArea1.setText(null);
opFolders = new ArrayList<>();

final Path baseDir = Paths.get(file.getAbsolutePath());
final List<Path> dirList = new ArrayList<>();
dirList.add(baseDir);

final FileVisitor<Path> visitor = new DirectoryCollectorVisitor(dirList);
Files.walkFileTree(baseDir, visitor);
if(opFolders.isEmpty()){
System.err.println("EMPTY");
}
for (File aFile : opFolders) {
if (!aFile.isDirectory() && !aFile.getName().toLowerCase().endsWith(".db")) {
jTextArea1.append(aFile.getAbsolutePath() + "\n");

}

}

jTextArea1.append("...COMPLETE...");
} catch (Exception ex) {
System.out.println("Problem accessing directory: " + file.getAbsolutePath());
}
} else {
System.out.println("File access cancelled by user.");
}

}

@fge 更新了代码

最佳答案

不幸的是,您说您仅限于 Java 6。鉴于该要求,无法使用 File API 来做到这一点。 .listFiles() 只能以急切的方式填充目录条目。

好吧,有一种方法...如果您使用类似 Unix 的操作系统,您可以使用 ProcessBuilder 并使用诸如 find -type d -name online 这样的命令从基本目录发出进程:

final File baseDir = ...;
final ProcessBuilder pb = new ProcessBuilder(
"find", "-type", "d", "-name", "online"
);
pb.directory(baseDir);

final Process p = pb.start();
// use the Process' InputStream

如果您使用 Java 7+,您会更轻松;编写一个 FileVisitor 来收集数据到列表中:

public final class DirectoryCollectorVisitor
extends SimpleFileVisitor<Path>
{
private final List<Path> list;

public DirectoryCollectorVisitor(final List<Path> list)
{
this.list = list;
}

@Override
public FileVisitResult previsitDirectory(final Path path, final BasicFileAttributes attrs)
{
if (path.getFileName().toString().equals("online"))
list.add(path);
return FileVisitResult.CONTINUE;
}
}

// ...

final Path baseDir = Paths.get(...);
final List<Path> dirList = new ArrayList<>();
final FileVisitor<Path> visitor = new DirectoryCollectorVisitor(list);
Files.walkFileTree(baseDir, visitor);
// dirList is not filled with the entries

使用 Java 8,一切变得更加简单:

private static final BiPredicate<Path, BasicFileAttributes> ONLINE_DIRS 
= (path, attrs) -> attrs.isDirectory()
&& path.getFileName().toString().equals("online");

// ...

final Path baseDir = Paths.get(...);
final List<Path> dirList;

try (
final Stream<Path> stream = Files.find(baseDir, Integer.MAX_VALUE,
ONLINE_DIRS);
) {
dirList = stream.collect(Collectors.toList());
}

关于java - 搜索大目录中的多个文件夹 - JAVA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33937057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com