Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在大目录中搜索多个文件夹-JAVA_Java_Search_Directory_Subdirectory - Fatal编程技术网

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

在大目录中搜索多个文件夹-JAVA,java,search,directory,subdirectory,Java,Search,Directory,Subdirectory,我希望能够搜索一个大目录,包括所有子文件夹,查找每个名为“online”的文件夹,并将找到的文件夹添加到列表中 换句话说,这个文件是文件夹吗?如果不忽略,如果是,则此文件夹称为“联机”,如果是,则添加到列表,如果不打开,则循环浏览文件夹内容并重新启动 我有一个剧本: String fileType = "online"; private void buildList(File aFile) { if (aFile.isDirectory()) { if (fileName.cont

我希望能够搜索一个大目录,包括所有子文件夹,查找每个名为“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兼容。提前非常感谢

编辑:

静态长计数器=0L;
ArrayList文件夹;
公共最终类DirectoryCollectorVisitor扩展了SimpleFileVisitor{
私人最终名单;
public DirectoryCollectorVisitor(最终列表){
this.list=列表;
}
@凌驾
公共文件VisitResult preVisitDirectory(最终路径路径,最终基本文件属性属性属性){
counterPrintField.setText(“+counter++”);
如果(path.getFileName().toString()包含(“联机”)){
添加(路径);
File aFile=path.toFile();
opFolders.add(一个文件);
}
返回FileVisitResult.CONTINUE;
}
}
private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt){
JFileChooser-chooser=JFileChooser-1;
选择器.setCurrentDirectory(新的java.io.File(“O:\\Prod\\Clients”);
setFileSelectionMode(仅限于JFileChooser.DIRECTORIES_);
选择器.setAcceptableFileFilterUsed(false);
int returnVal=chooser.showOpenDialog(此);
if(returnVal==chooser.APPROVE_选项){
File File=chooser.getSelectedFile();
试一试{
jTextArea1.setText(空);
opFolders=newarraylist();
最终路径baseDir=Path.get(file.getAbsolutePath());
final List dirList=new ArrayList();
dirList.add(baseDir);
final FileVisitor=新的DirectoryCollectorVisitor(dirList);
walkFileTree(baseDir,visitor);
if(opFolders.isEmpty()){
系统错误println(“空”);
}
对于(文件:opFolders){
如果(!aFile.isDirectory()&&&!aFile.getName().toLowerCase().endsWith(“.db”)){
jTextArea1.append(aFile.getAbsolutePath()+“\n”);
}
}
jTextArea1.追加(“…完成…”);
}捕获(例外情况除外){
System.out.println(“访问目录时出现问题:+file.getAbsolutePath());
}
}否则{
System.out.println(“用户取消文件访问”);
}
}

@fge更新的代码

不幸的是,您说您仅限于Java 6。鉴于这一要求,没有办法使用
文件
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
如果你使用Java7+你会更轻松;编程一个
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
public最终类DirectoryCollectorVisitor
扩展SimpleFileVisitor
{
私人最终名单;
public DirectoryCollectorVisitor(最终列表)
{
this.list=列表;
}
@凌驾
公共文件VisitResult previsitDirectory(最终路径路径,最终基本文件属性属性属性)
{
if(path.getFileName().toString().equals(“联机”))
添加(路径);
返回FileVisitResult.CONTINUE;
}
}
// ...
最终路径baseDir=Path.get(…);
final List dirList=new ArrayList();
最终文件访问者=新目录收集器访问者(列表);
walkFileTree(baseDir,visitor);
//目录列表中未填入条目
使用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());
}
private static final双预测联机目录
=(路径,attrs)->attrs.isDirectory()
&&path.getFileName().toString().equals(“联机”);
// ...
最终路径baseDir=Path.get(…);
最终名单;
试一试(
最终流=Files.find(baseDir,Integer.MAX_值,
在线指南);
) {
dirList=stream.collect(Collectors.toList());
}

不幸的是,您说您仅限于Java 6。鉴于这一要求,没有办法使用
文件
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
如果你使用Java7+你会更轻松;编程一个
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
public最终类DirectoryCollectorVisitor
扩展SimpleFileVisitor
{
私人最终名单;
public DirectoryCollectorVisitor(最终列表)
{
this.list=列表;
}
@凌驾
公共文件VisitResult previsitDirectory(最终路径路径,最终基本文件属性属性属性)
{
if(path.getFileName().toString().equals(“联机”))
添加(路径);
返回FileVisitResult.CONTINUE;
}
}
// ...
最终路径baseDir=Path.get(…);
final List dirList=new ArrayList();
最终文件访问者=新目录收集器访问者(列表);
walkFileTree(baseDir,visitor);
//目录列表中未填入条目
使用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());
}
private static final双预测联机目录
=(路径,attrs)->attrs.isDirectory()
&&path.getFileName().toString().equals(“联机”);
// ...
最终的