【问题标题】:returning ArrayList<file> method java返回 ArrayList<file> 方法 java
【发布时间】:2015-01-29 02:51:37
【问题描述】:

当我编译时,我没有收到任何错误,但是方法中的 ArrayList&lt;File&gt; 没有进入主程序。

所有条目都已添加到 Folders ArrayList 中,但没有传递到 main 方法中。

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);
     }
  }
}

【问题讨论】:

    标签: java file methods arraylist


    【解决方案1】:

    问题在于您的递归 - 您正确识别 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]));
    

    【讨论】:

      【解决方案2】:

      你创造

      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
      }
      

      如果您需要为文件处理多级树,这将非常有用。

      【讨论】:

        【解决方案3】:

        您可以定义一个类级别变量static ArrayList&lt;File&gt; Folders = new ArrayList&lt;File&gt;();,然后将其用于填充文件。

        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;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-05-27
          • 2014-11-17
          • 2014-05-12
          • 2015-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多