возвращая ArrayList <файл> метод Java

1

Когда я компилирую, я не получаю никаких ошибок, но метод ArrayList<File> из метода не попадает в основную часть.

Все записи добавлены в Folders ArrayList но они не передаются в основной метод.

public static ArrayList<File> Process(File aFile)
 {
  ArrayList<File> Folders = new ArrayList<File>();

  if(aFile.isFile())
  {
     String filenom = aFile.getPath();
     if (filenom.toLowerCase().endsWith(".java")){
        Folders.add(aFile);
     }
  }
  else if (aFile.isDirectory()) {
     File[] listOfFiles = aFile.listFiles();
     if(listOfFiles!=null) {
        for (int i = 0; i < listOfFiles.length; i++)
           Process(listOfFiles[i]);
     } 
     else {
        System.out.println(" [ACCESS DENIED]");
     }
  }    
  return (Folders);
}

public static void main(String[] args) throws IOException
{
  ArrayList<File> FAddress = new ArrayList<File>();
  File dir = new File("C:/");
  FAddress = Process(dir);
     if (FAddress.isEmpty())
     System.out.println("WTF?!");
  else{
     for (File fl : FAddress) {
        String FileAddress = fl.getName();
        System.out.println(FileAddress);
     }
  }
}
Теги:
file
arraylist
methods

3 ответа

2

Проблема заключается в вашей рекурсии - вы правильно определяете, является ли File каталогом, и вызовите " Process на нем:

for (int i = 0; i < listOfFiles.length; i++)
    Process(listOfFiles[i]);

Но вы забыли добавить его результат в возвращаемое значение (Folders), поэтому любой результат из подкаталогов не будет добавлен к возвращаемому значению:

for (int i = 0; i < listOfFiles.length; i++)
    Folders.addAll(Process(listOfFiles[i]));
1

Вы создаете

ArrayList<File> Folders = new ArrayList<File>();

в каждый момент запуска процесса. Эта функция имеет рекурсию, поэтому, поскольку вы начинаете с папки C:/, вы никогда не обновляете этот массив.

для правильной обработки вы должны использовать что-то вроде:

public static ArrayList<File> Process(File aFile) {
    ArrayList<File> Folders = new ArrayList<File>();
    Process(aFile, Folders);
    return folders;
}

private static void Process(File aFile, ArrayList<File> Folders) {
    ... //your implementation without defining Folders and returning it
}

это будет полезно, если вам нужно обработать много уровней дерева для файлов.

1

Вы можете определить переменную уровня класса static ArrayList<File> Folders = new ArrayList<File>(); а затем использовать то же самое для заполнения файлов.

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

public class test {
    static ArrayList<File> Folders = new ArrayList<File>();
    public static void Process(File aFile) {


        if (aFile.isFile()) {
            String filenom = aFile.getPath();
            if (filenom.toLowerCase().endsWith(".log")) {
                Folders.add(aFile);
            }
        } else if (aFile.isDirectory()) {
            File[] listOfFiles = aFile.listFiles();
            if (listOfFiles != null) {
                for (int i = 0; i < listOfFiles.length; i++)
                    Process(listOfFiles[i]);
            } else {
                System.out.println(" [ACCESS DENIED]");
            }
        }
    }

    public static void main(String[] args) throws IOException {
        File dir = new File("C:/ukba/");
        Process(dir);
        if (Folders.isEmpty())
            System.out.println("WTF?!");
        else {
            for (File fl : Folders) {
                String FileAddress = fl.getName();
                System.out.println(FileAddress);
            }
        }
        Folders = null;
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню