Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.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列出所有具有图像的文件夹_Android_Image_File Browser - Fatal编程技术网

android列出所有具有图像的文件夹

android列出所有具有图像的文件夹,android,image,file-browser,Android,Image,File Browser,作为我的应用程序的一部分,我需要一个只列出特定文件夹的文件浏览器。 对于eg,仅列出在任何级别的任何子文件夹中创建图像文件的路径中的文件夹 我可以用递归来实现。但它会影响性能。尤其是在顶层查找文件夹需要许多递归调用。有更好的方法吗 请看下面我的代码 public List<GeneralFileItem> getGridItemsList(String root) { List<GeneralFileItem> gridItemsList = new ArrayL

作为我的应用程序的一部分,我需要一个只列出特定文件夹的文件浏览器。 对于eg,仅列出在任何级别的任何子文件夹中创建图像文件的路径中的文件夹

我可以用递归来实现。但它会影响性能。尤其是在顶层查找文件夹需要许多递归调用。有更好的方法吗

请看下面我的代码

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;
}
公共列表getGridItemsList(字符串根){ List gridItemsList=新建ArrayList(); 文件; 文件=新文件(根); 文件列表[]=File.listFiles(); 如果(list.length==0){ 返回null; } for(int i=0;i 我想知道除了递归搜索,还有没有别的方法。这些文件是如何在Android中维护的。我知道各种文件系统都受支持,不同的硬件制造商支持不同的文件系统。我想知道是否有一种类似于FileTable的方法可以从中获取所有.jpg文件。

用于搜索特定类型的文件

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

你的算法应该是

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
        }
     }
文件;
文件=新文件(根);
文件列表[]=File.listFiles();
如果(list.length==0){
返回null;
}
for(int i=0;i

为了简化这个过程,您可以根据需要将这些方法分离为不同的方法。

我想到了一些东西!它就像一个符咒

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

File = rootPrimary = new File(Environment.getExternalStorageDirectory());
然后,您必须将所有文件列在一个文件[]中

File[] fileArray = rootDirectory.listFiles();
然后创建一个ArrayList并将其设置为我创建的方法,然后传入文件[]

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

又一个使用Java8
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");
        }
}

尝试使用…谢谢你的回复。您建议的filenamefilter接口对于获取当前目录中的所有图像文件非常有用。我的要求是获得所有目录,其中至少有一个图像在其任何子文件夹在任何级别。检查此链接,希望它将是有益的@preetha你可以告诉mw你如何解决你的问题???我也面临samei目前正在做递归。我的问题是,完成递归搜索需要花费大量时间。我无法理解filefilter将如何帮助提高性能,因为这里的关键点是递归解析。如果我在一个子文件夹较少的文件夹中,我的算法会更快。问题是您首先要搜索整个文件夹,将其添加到列表中,然后在gridview中呈现。您可以尝试延迟加载,请参见此处的示例
alFolders.addAll(putImgFldr(secFileArray));
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");
        }
}