0

作为我的应用程序的一部分,我需要有只列出特定文件夹的文件浏览器。例如,仅在路径中列出图像文件在其任何级别的任何子文件夹中的那些文件夹。

我可以使用递归来做到这一点。但是会影响性能。特别是在顶层查找文件夹需要许多递归调用。有没有更好的方法来做到这一点

请在下面查看我的代码

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 文件。

4

3 回答 3

0

使用FilenameFilter搜索特定类型的文件。

目前您只检查当前目录。但是,如果您希望递归搜索,则必须检查找到的每个文件是否是目录

你的算法会是这样的

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

为了简化这一点,您可以根据您的要求将它们分成方法。

于 2012-05-16T08:00:04.843 回答
0

这是我想出的东西!它就像一个魅力!

首先你必须创建一个文件,这个是 SD 卡的根目录

File = rootPrimary = new File(Environment.getExternalStorageDirectory());

比您必须将所有文件列出到 File []

File[] fileArray = rootDirectory.listFiles();

然后您创建一个 ArrayList 并将其设置为等于我创建的方法并将 File[] 传入。

ArrayList<File> alFolders = new ArrayList<File>();
        alFolder = putImgFldr(fileArray);

此方法将添加所有包含扩展名为 .jpg 和 .png 的图像的目录。

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

现在如果需要,您可以将另一个文件 [] 添加到 alFolders

alFolders.addAll(putImgFldr(secFileArray));
于 2016-01-31T16:39:18.043 回答
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");
        }
}
于 2020-08-04T00:37:25.873 回答