作为我的应用程序的一部分,我需要有文件浏览器,只列出特定的文件夹。 例如,仅列出路径中任何级别的任何子文件夹中的图像文件的文件夹。
我可以使用递归来做到这一点。但它会影响性能。特别是在顶层查找文件夹需要许多递归调用。有更好的方法吗
请参阅下面的代码
public List<GeneralFileItem> getGridItemsList(String root) {
List<GeneralFileItem> gridItemsList = new ArrayList<GeneralFileItem>();
File file;
file = new File(root);
File list[] = file.listFiles();
if (list.length == 0) {
return null;
}
for (int i = 0; i < list.length; i++) {
GeneralFileItem item = new GeneralFileItem();
File temp_file = new File(file.getAbsolutePath(), list[i].getName());
if (hasPhoto(temp_file)) {
item.setPath(file.getAbsolutePath() + "/" + list[i].getName());
item.setName(list[i].getName());
if (temp_file.listFiles() != null) {
item.setType(GeneralFileItem.DIRECTORY_TYPE);
} else {
item.setType(GeneralFileItem.FILE_TYPE);
}
gridItemsList.add(item);
//Log.i(TAG,"added"+list[i].getName());
}
}
return gridItemsList;
}
private boolean hasPhoto(File temp_file) {
//Log.i(TAG,temp_file.getName());
if (temp_file.listFiles() == null) {
if (temp_file.getName().toUpperCase().endsWith(("JPG"))) {
//Log.i(TAG,temp_file.getName()+ "is a photo");
return true;
} else
return false;
}
else{
File list[] = temp_file.listFiles();
for (int i = 0; i < list.length; i++) {
if(hasPhoto(list[i]))
return true;
}
}
return false;
}
我想知道除了递归搜索之外是否还有其他方法。如何在Android中维护文件。我知道支持各种文件系统,它与硬件制造商不同。我想知道是否有一种方式,如果有FileTable,我可以从中获取所有.jpg文件。
答案 0 :(得分:0)
使用FilenameFilter搜索specirfic类型的文件。
目前您只检查当前目录。但是如果您希望以递归方式搜索,则必须检查找到的每个文件是否是目录
你的算法会像
File file;
file = new File(root);
File list[] = file.listFiles();
if (list.length == 0) {
return null;
}
for (int i = 0; i < list.length; i++) {
if(list[i].isDirectory()){
//Then go inside it to search for specific file
File subList[] = list[i].listFiles();
//search for jpg..
}else if("is this jpg"){
//Add to list
}
}
为了简化这一点,您可以根据您的要求将这些方法分离为方法。
答案 1 :(得分:0)
这是我出现的事情!它就像一个魅力!
首先你必须创建一个文件,这个是SD卡的根目录
File = rootPrimary = new File(Environment.getExternalStorageDirectory());
比必须将所有文件列入文件[]
File[] fileArray = rootDirectory.listFiles();
然后创建一个ArrayList并将其设置为等于我创建的方法并传递File []。
ArrayList<File> alFolders = new ArrayList<File>();
alFolder = putImgFldr(fileArray);
此方法将添加包含.jpg和.png扩展名图像的所有dorectory。
private ArrayList<File> putImgFldr(File[] fileArray) {
// TODO Auto-generated method stub
ArrayList<File> a = new ArrayList<File>();
for (int i = 0; i < fileArray.length; i++) {
if (fileArray[i].isDirectory()) {
//if file is folder pass that file trough this method
a.addAll(putImgFldr(fileArray[i].listFiles()));
} else if (fileArray[i].getAbsolutePath().endsWith(".jpg") || fileArray[i].getAbsolutePath().endsWith(".png")) {
// if file is img ad it's parent, folder to ArrayList
a.add(fileArray[i].getParentFile());
// this finishes the file searching
// because the image has allready bean found
i = fileArray.length + 1;
}
}
return a;
}
现在如果nessesery
,您可以将另一个文件[]添加到alFoldersalFolders.addAll(putImgFldr(secFileArray));
答案 2 :(得分:0)
另一个使用Java 8 filter
列出文件和目录的示例。例如,这里我只使用jpeg图片
public static void main(String[] args) {
System.out.println("Files!!");
try {
Files.walk(Paths.get("."))
.filter(Files::isRegularFile)
.filter(c ->
c.getFileName().toString().substring(c.getFileName().toString().length()-4).contains(".jpg")
||
c.getFileName().toString().substring(c.getFileName().toString().length()-5).contains(".jpeg")
)
.forEach(System.out::println);
} catch (IOException e) {
System.out.println("No jpeg or jpg files");
}
System.out.println("\nDirectories!!\n");
try {
Files.walk(Paths.get("."))
.filter(Files::isDirectory)
.forEach(System.out::println);
} catch (IOException e) {
System.out.println("No Jpeg files");
}
}