Android 文件读取

在 Android 中,文件读取的方式取决于文件的存储位置。以下是常见的文件存储位置及其读取方法:

  1. 内部存储:应用私有存储,其他应用无法访问。
  2. 外部存储:公共存储,需要权限。
  3. 资源文件:存储在 res/raw 文件夹中。
  4. Assets 文件夹:存储在 assets 文件夹中。

实现步骤

1. 从内部存储读取文件

内部存储文件是应用私有的,适合存储敏感数据。

import android.content.Context;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

public class FileUtils {
    public static String readFromInternalStorage(Context context, String fileName) {
        StringBuilder content = new StringBuilder();
        try (FileInputStream fis = context.openFileInput(fileName);
             InputStreamReader isr = new InputStreamReader(fis);
             BufferedReader reader = new BufferedReader(isr)) {

            String line;
            while ((line = reader.readLine()) != null) {
                content.append(line).append("\n");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return content.toString();
    }
}

调用示例

String content = FileUtils.readFromInternalStorage(context, "example.txt");

2. 从外部存储读取文件

外部存储需要权限,适合存储共享数据。

权限声明(在 AndroidManifest.xml 中):

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

代码实现

import android.os.Environment;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

public class FileUtils {
    public static String readFromExternalStorage(String filePath) {
        StringBuilder content = new StringBuilder();
        File file = new File(Environment.getExternalStorageDirectory(), filePath);
        if (file.exists()) {
            try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
                String line;
                while ((line = reader.readLine()) != null) {
                    content.append(line).append("\n");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return content.toString();
    }
}

调用示例

String content = FileUtils.readFromExternalStorage("example.txt");

3. 从资源文件读取内容

资源文件存储在 res/raw 文件夹中,适合存储静态文件。

代码实现

import android.content.Context;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class FileUtils {
    public static String readFromRawResource(Context context, int resourceId) {
        StringBuilder content = new StringBuilder();
        try (InputStream is = context.getResources().openRawResource(resourceId);
             InputStreamReader isr = new InputStreamReader(is);
             BufferedReader reader = new BufferedReader(isr)) {

            String line;
            while ((line = reader.readLine()) != null) {
                content.append(line).append("\n");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return content.toString();
    }
}

调用示例

String content = FileUtils.readFromRawResource(context, R.raw.example);

4. 从 Assets 文件夹读取内容

Assets 文件夹适合存储静态文件或配置文件。

代码实现

import android.content.Context;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class FileUtils {
    public static String readFromAssets(Context context, String fileName) {
        StringBuilder content = new StringBuilder();
        try (InputStreamReader isr = new InputStreamReader(context.getAssets().open(fileName));
             BufferedReader reader = new BufferedReader(isr)) {

            String line;
            while ((line = reader.readLine()) != null) {
                content.append(line).append("\n");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return content.toString();
    }
}

调用示例

String content = FileUtils.readFromAssets(context, "example.txt");

注意事项

  1. 权限管理:从 Android 6.0 (API 23) 开始,外部存储需要动态申请权限。
  2. 文件路径:确保文件路径正确,避免 FileNotFoundException
  3. 异常处理:在文件操作中,需处理可能的异常,如文件不存在或权限不足。

完整解决方案类

将上述方法整合到一个工具类中:

import android.content.Context;
import android.os.Environment;
import java.io.*;

public class FileUtils {
    // 从内部存储读取
    public static String readFromInternalStorage(Context context, String fileName) {
        StringBuilder content = new StringBuilder();
        try (FileInputStream fis = context.openFileInput(fileName);
             InputStreamReader isr = new InputStreamReader(fis);
             BufferedReader reader = new BufferedReader(isr)) {

            String line;
            while ((line = reader.readLine()) != null) {
                content.append(line).append("\n");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return content.toString();
    }

    // 从外部存储读取
    public static String readFromExternalStorage(String filePath) {
        StringBuilder content = new StringBuilder();
        File file = new File(Environment.getExternalStorageDirectory(), filePath);
        if (file.exists()) {
            try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
                String line;
                while ((line = reader.readLine()) != null) {
                    content.append(line).append("\n");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return content.toString();
    }

    // 从资源文件读取
    public static String readFromRawResource(Context context, int resourceId) {
        StringBuilder content = new StringBuilder();
        try (InputStream is = context.getResources().openRawResource(resourceId);
             InputStreamReader isr = new InputStreamReader(is);
             BufferedReader reader = new BufferedReader(isr)) {

            String line;
            while ((line = reader.readLine()) != null) {
                content.append(line).append("\n");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return content.toString();
    }

    // 从 Assets 文件夹读取
    public static String readFromAssets(Context context, String fileName) {
        StringBuilder content = new StringBuilder();
        try (InputStreamReader isr = new InputStreamReader(context.getAssets().open(fileName));
             BufferedReader reader = new BufferedReader(isr)) {

            String line;
            while ((line = reader.readLine()) != null) {
                content.append(line).append("\n");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return content.toString();
    }
}

总结

通过上述,可以根据文件存储位置选择合适的读取方法,满足 Android 应用中不同场景的文件读取需求。

你可能感兴趣的:(Android,文件读取,android)