Android遍历路径下所有文件

在Android开发中,有时候我们需要遍历手机存储中的文件,例如查找某个文件或者统计文件数量等。本篇文章将介绍如何使用Java代码在Android设备中遍历指定路径下的所有文件,并提供代码示例。

为什么需要遍历文件?

在Android开发中,我们经常需要对手机存储中的文件进行操作,例如查找某个文件、统计文件数量、删除文件等。而遍历文件是实现这些操作的基础。

遍历文件可以帮助我们获取指定路径下的所有文件,然后根据需求进行相应的操作。例如,我们可以获取某个文件夹下所有的图片文件,然后展示在界面上;或者统计某个文件夹下所有文件的大小,用于清理磁盘空间。

使用Java代码遍历文件

在Android中,我们可以使用Java代码来遍历指定路径下的所有文件。下面是一个基本的遍历文件的示例代码:

import java.io.File;

public class FileTraversal {
    public static void traverseFiles(String path) {
        File file = new File(path);
        if (file.isDirectory()) {
            File[] files = file.listFiles();
            if (files != null && files.length > 0) {
                for (File childFile : files) {
                    if (childFile.isDirectory()) {
                        traverseFiles(childFile.getAbsolutePath());
                    } else {
                        // 对文件进行操作,例如打印文件路径
                        System.out.println("File path: " + childFile.getAbsolutePath());
                    }
                }
            }
        } else {
            // 处理文件
            // ...
        }
    }
}

上述代码中,我们使用了递归的方式遍历指定路径下的所有文件。首先,我们通过File类创建一个文件对象,然后判断是否为目录。如果是目录,则获取目录下的所有文件,并递归调用traverseFiles方法来遍历子目录。如果是文件,则可以进行相应的操作。

示例应用

为了更好地理解如何遍历文件,我们可以创建一个示例应用来演示。这个应用可以列出指定路径下所有的图片文件,并显示图片文件的数量和大小。

首先,在AndroidManifest.xml文件中添加以下权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

然后,在MainActivity.java中编写以下代码:

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import java.io.File;

public class MainActivity extends AppCompatActivity {
    private static final int REQUEST_PERMISSION = 1;
    private TextView tvResult;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        tvResult = findViewById(R.id.tv_result);

        // 检查读取外部存储权限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                    REQUEST_PERMISSION);
        } else {
            // 有权限,开始遍历文件
            traverseFiles(Environment.getExternalStorageDirectory().getAbsolutePath());
        }
    }

    private void traverseFiles(String path) {
        File file = new File(path);
        if (file.isDirectory()) {
            File[] files = file.listFiles();
            if (files != null && files.length > 0) {
                int imageCount = 0;
                long totalSize = 0;
                for (File childFile : files) {
                    if (childFile.isDirectory()) {
                        traverseFiles(childFile.getAbsolutePath());
                    } else {
                        if (isImageFile(childFile)) {
                            imageCount++;
                            totalSize += childFile.length();
                        }
                    }
                }
                updateResult(imageCount, totalSize);
            }
        }
    }

    private boolean isImageFile(File file) {
        String fileName = file.getName();
        return fileName.endsWith(".jpg") || fileName.endsWith(".jpeg") || fileName.endsWith(".png");
    }

    private void updateResult(int imageCount, long totalSize) {
        String result = "Image count: " + imageCount + "\nTotal size: " + formatSize(totalSize);
        tvResult.setText(result);
    }

    private String formatSize(long size) {
        if (size <= 0) return "0 B";
        final String[] units = new String[]{"B", "KB", "MB", "GB", "TB"};
        int digitGroups = (int) (Math.log10(size) / Math.log10(1024