Java, поиск файлов данного шаблона и получить имена каталогов и полные имена файлов - PullRequest
0 голосов
/ 25 октября 2018

Я новичок в Java.Поиск кода для поиска файлов с расширением .ofg во всех подкаталогах /var/data.

. Требуемыми выходными данными являются

  • имя подкаталога, котороесодержит файлы с этими файлами
  • полные имена файлов
  • количество этих файлов в этом подкаталоге.

Есть несколько учебных пособий, но ничегоя мог бы найти подходящий для моей базы кода;как

public class FindFiles {

    int inProcThreshold = 0;

    protected File recurfile(File file) {
        File[] dirlist = file.listFiles();

        for (File f : dirlist) {
            if (f.isDirectory()) {
                return f;
            }
        }

        return null;
    }

    protected int numOfInProcs(String location, int level, int maxdepth) {
        File base = new File(location);
        File[] firstlevelfiles = base.listFiles();

        while (level <= maxdepth) {
            for (File afile : firstlevelfiles) {
                if (afile.isDirectory()) {
                    base = recurfile(afile);
                } else {
                    if (afile.getName().endsWith(".txt")) {
                        inProcThreshold++;
                    }
                }
            }
            level++;
        }

        return inProcThreshold;
    }

    public static void main(String[] args) {
        FindFiles test = new FindFiles();
        String dirToList = "I:\\TEST-FOLDER";
        String ext = ".txt";
        int count = test.numOfInProcs(dirToList, 0, 10);
        System.out.println("Number of txt files are " + count);
    }

}

Это код, который я пытаюсь, но он возвращает 0 в качестве вывода для меня.Я пытаюсь найти файлы с расширением .txt в подпапках I: \ TEST-FOLDER.

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Я думаю, что вы ищете Files.find .Передайте ему Predicate, который проверяет, что path.toString (). EndWith (". Ofg"),

Возвращает объекты Stream of Path, представляющие соответствующие файлы.Вы можете извлечь все данные, которые хотите, итерируя в этом потоке.

0 голосов
/ 30 октября 2018

Если вам не требуется писать рекурсивную часть самостоятельно (для практики или в качестве задачи), вы можете использовать Files # walkFileTree с пользовательской реализацией интерфейса FileVisitor (как@ Мена предложено в его комментарии).

Расширьте класс SimpleFileVisitor (или реализуйте интерфейс FileVisitor) и предоставьте свой код, который будет выполняться для каждого файла:

public class OfgFolderCollectingFileVisitor extends SimpleFileVisitor<Path> {

  /** Stores the matching file paths */
  private final List<Path> collectedPaths = new LinkedList<>();


  @Override
  public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs) throws IOException {
    // check if the current file is an .ofg file
    if (file.toString().endsWith(".ofg")) {
      // it is -> add it's containing folder to the collection
      this.collectedPaths.add(file.getParent());
    }

    return super.visitFile(file, attrs);
  }


  public List<Path> getCollectedPaths() {
    return this.collectedPaths;
  }

}

Затем передайте экземпляр вашей реализации в Files # walkFileTree и впоследствии проверьте собранные пути:

final OfgFolderCollectingFileVisitor visitor = new OfgFolderCollectingFileVisitor();

try {
  Files.walkFileTree(Paths.get("/var/data"), visitor);
} catch (final IOException ex) {
  ex.printStackTrace();
  return;
}

// let's see if something matched our criteria

final List<Path> ofgContainers = visitor.getCollectedPaths();

System.out.printf("Files found: %d%n", ofgContainers.size());

if (!ofgContainers.isEmpty()) {
  System.out.printf("%nContaining directories:%n");

  for (final Path ofgContainer : ofgContainers) {
    System.out.printf("- %s%n", ofgContaininer);
  }
}

Вот пример выходных данных (да, folder2 и это подпапка с файлом .ofg)

Files found: 3

Containing directories:
- \var\data\folder1\folder1.1
- \var\data\folder2
- \var\data\folder2\folder2.2
0 голосов
/ 25 октября 2018

Используйте этот фильтр, указав адрес каталога в параметре dirName, в котором будут перечислены все каталоги с расширением .ofg

 import java.io.File;
import java.io.FilenameFilter;

public class Filter {

    public File[] finder( String dirName){
        File dir = new File(dirName);

        return dir.listFiles(new FilenameFilter() { 
                 public boolean accept(File dir, String filename)
                      { return filename.endsWith(".ofg"); }
        } );

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...