递归函数返回文件列表-Android Java-文件管理器
我想从一个函数返回一个文件列表,该函数循环遍历android上SD卡上的所有文件/目录,并确认特定的数据类型MP3、mp4、png。但我无法确定何时从循环返回值。有人能帮我吗 我的代码:递归函数返回文件列表-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
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-不要这样做!创建一个简单的类,并返回一个更具可读性的类。