在Android上如何计算特定扩展名的文件数量?

4
在我正在为Android开发的应用程序中,我允许用户创建特定于我的应用程序的文件,并使用扩展名“.rbc”。到目前为止,我已经成功创建、写入和读取这些文件。
现在,我正在尝试计算存在的这些文件的数量。我对Java并不是特别熟悉,而且我刚开始为Android编程,所以感觉有点迷失。到目前为止,我所有尝试都无法找到具有我的扩展名的任何文件。
因此,我基本上有两个问题需要回答,以便我可以解决这个问题:
Android存储应用程序创建的文件的默认目录在哪里?
您能否给我提供在Android上计算特定扩展名文件数量的示例?
非常感谢您提前的时间。
4个回答

8
一些测试结果显示,使用Context.getFilesDir()创建应用程序文件的默认目录为/data/data/<your_package_name>/files
要计算任何给定目录中的文件数,可以在根目录上使用File.listFiles(FileFilter)。您的FileFilter应该是以下内容(用于过滤“.rbc”文件):
public static class RBCFileFilter implements FileFilter {

    @Override
    public boolean accept(File pathname) {
        String suffix = ".rbc";
        if( pathname.getName().toLowerCase().endsWith(suffix) ) {
            return true;
        }
        return false;
    }

}

如果您有某种需要递归搜索的目录结构,那么您将不得不在整个目录结构上使用File.listFiles(FileFilter)。代码应该类似于:
public static List<File> listFiles(File rootDir, FileFilter filter, boolean recursive) {
    List<File> result = new ArrayList<File>();
    if( !rootDir.exists() || !rootDir.isDirectory() ) 
        return result;


    //Add all files that comply with the given filter
    File[] files = rootDir.listFiles(filter);
    for( File f : files) {
        if( !result.contains(f) )
            result.add(f);
    }

    //Recurse through all available dirs if we are scanning recursively
    if( recursive ) {
        File[] dirs = rootDir.listFiles(new DirFilter());
        for( File f : dirs ) {
            if( f.canRead() ) {
                result.addAll(listFiles(f, filter, recursive));
            }
        }
    }

    return result;
}

如果要实现FileFilter,可以这样实现DirFilter:

public static class DirFilter implements FileFilter {

    @Override
    public boolean accept(File pathname) {
        if( pathname.isDirectory() ) 
            return true;

        return false;
    }

}

2

Android通常会将应用程序创建的文件存储在data/data/package_name_of_launching_Activity目录下,您可以在该路径中通过调用getCacheDir()方法获取缓存目录。

计算特定扩展名的快速策略如下:

如果您有一个文件夹,例如 File folder = new File(folderPath),其中folderPath是文件夹的绝对路径。您可以执行以下操作:

String[] fileNames = folder.list();
int total = 0;
for (int i = 0; i< filenames.length; i++)
{
  if (filenames[i].contains(".rbc"))
    {
      total++;
     }
  }

这可以给你一个以“.rbc”为扩展名的文件总数。虽然这可能不是最好/高效的方法,但它仍然有效。


必须指出的是,Context.getCacheDir() 提供了 /data/data/<package-name>/cache 的位置,而 Context.getFilesDir() 指向 /data/data/<package-name>/files。前者定期被清空,因此在缓存目录中存储文件时要注意。 - Tiago

1

这里是一个Java 8+的示例:

var total=Arrays.asList(new File(pathToDirectory).list())
                      .stream()
                      .filter(x -> x.contains(".rbc"))
                      .collect(Collectors.counting());

或者

var fileNames = Arrays.asList(tempDir.list())
                       .stream()
                       .filter(x -> x.contains(".rbc"))
                       .collect(Collectors.toList());
var total=fileNames.size();

0

统计文件数量,您可以尝试使用此代码:

# public static List getFiles(File aStartingDir)   
# {  
#     List result = new ArrayList();  
#    
#     File[] filesAndDirs = aStartingDir.listFiles();  
#     List filesDirs = Arrays.asList(filesAndDirs);  
#     Iterator filesIter = filesDirs.iterator();  
#     File file = null;  
#     while ( filesIter.hasNext() ) {  
#       file = (File)filesIter.next();  
#       result.add(file); //always add, even if directory  
#       if (!file.isFile()) {  
#         //must be a directory  
#         //recursive call!  
#         List deeperList = getFileListing(file);  
#         result.addAll(deeperList);  
#       }  
#    
#     }  
#     Collections.sort(result);  
#     return result;  
#   }  

您可以使用fileFilter参数来列出具有.rbc扩展名的文件。

编辑:抱歉,我漏掉了一个问题。文件将被放置在您的应用程序包中,该包将位于data/data..中。您可以在Eclipse的DDMS模式下的文件浏览器中查看它们。


listFiles() 方法属于哪个类? - Rob S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接