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