Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.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
递归函数返回文件列表-Android Java-文件管理器_Java_Android - Fatal编程技术网

递归函数返回文件列表-Android Java-文件管理器

递归函数返回文件列表-Android Java-文件管理器,java,android,Java,Android,我想从一个函数返回一个文件列表,该函数循环遍历android上SD卡上的所有文件/目录,并确认特定的数据类型MP3、mp4、png。但我无法确定何时从循环返回值。有人能帮我吗 我的代码: private Pattern patternVideo = Pattern.compile("([^\\s]+(\\.(?i)(mp4))$)"); private Pattern patternAudio = Pattern.compile("([^\\s]+(\\.(?i)(mp3))$)"); priv

我想从一个函数返回一个文件列表,该函数循环遍历android上SD卡上的所有文件/目录,并确认特定的数据类型MP3、mp4、png。但我无法确定何时从循环返回值。有人能帮我吗

我的代码:

private Pattern patternVideo = Pattern.compile("([^\\s]+(\\.(?i)(mp4))$)");
private Pattern patternAudio = Pattern.compile("([^\\s]+(\\.(?i)(mp3))$)");
private Pattern patternImages = Pattern
        .compile("([^\\s]+(\\.(?i)(png|jpeg|jpg))$)");

Matcher videoMatcher, audioMatcher, imageMatcher;

private ArrayList<String> videoFiles = new ArrayList<String>();
private ArrayList<String> audioFiles = new ArrayList<String>();
private ArrayList<String> imageFiles = new ArrayList<String>();


   private void buildFileList(File dirName) {
    if (dirName.isFile()) {
        // matcher = pattern.matcher(dirName.getName());
        // if (matcher.find())
        // fileNamesWithPaths.add(dirName.getAbsolutePath());
    } else if (dirName.isDirectory()) {
        File[] files = dirName.listFiles();
        for (File file : files) {
            if (file.isFile()) {
                videoMatcher = patternVideo.matcher(file.getName());
                audioMatcher = patternAudio.matcher(file.getName());
                imageMatcher = patternImages.matcher(file.getName());
                if (videoMatcher.find()) {
                    videoFileNames.add(file.getAbsolutePath());
                } else if (audioMatcher.find()) {
                    audioFileNames.add(file.getAbsolutePath());
                } else if (imageMatcher.find()) {
                    imageFileNames.add(file.getAbsolutePath());
                }
            } else if (file.isDirectory()) {
                buildFileList(file);
            }
        }
    }
}

你不需要归还任何东西;通话后,三个*文件列表将包含您要查找的所有文件


编辑:为什么不使用MediaStore提供程序?

使用堆栈将帮助您避免递归:

private void buildFileList(File dirName) {
    Stack<File> stack = new Stack<File>();
    stack.add(dirName);

    while(!stack.isEmpty()){
        File next = stack.pop();
        if (next.isFile()) {

            // do something...

        } else if (next.isDirectory()) {
            stack.addAll(Arrays.asList(next.listFiles()));
        }
    }
}

只需将返回语句放在isDirectory测试之外:

  private ArrayList buildFileList(File dirName) {
       if (dirName.isDirectory()) {
            File[] files = dirName.listFiles();
            for (File file : files) {
                if (file.isFile()) {
                    videoMatcher = patternVideo.matcher(file.getName());
                    audioMatcher = patternAudio.matcher(file.getName());
                    imageMatcher = patternImages.matcher(file.getName());
                    if (videoMatcher.find()) {
                        videoFiles.add(file.getAbsolutePath());
                    } else if (audioMatcher.find()) {
                        audioFiles.add(file.getAbsolutePath());
                    } else if (imageMatcher.find()) {
                        imageFiles.add(file.getAbsolutePath());
                    }
                } else if (file.isDirectory()) {
                    buildFileList(file);
                }
            }
        }
        //Combine your arrayLists here 
        return CombinedLists          //return the Combined Lists
    }

你的方法不应该返回一些东西吗?为什么要将其作为void?这是该代码的早期版本,它使用文件名填充数组列表。现在,我希望它在调用函数时返回文件名。我希望它位于单独的类中,并在调用此方法buildFileList时返回文件列表。但是您有三个列表,并且一个方法只能返回一个对象。解决方案:将三个列表封装在一个对象中——可以是具有buildFileList方法的同一个类。我将使用ArrayList finalList=新ArrayList;将所有列表添加到一个列表中。我主要关心的是什么时候归还这个finalList.WTH-不要这样做!创建一个简单的类,并返回一个更具可读性的类。