You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android开发中Java代码无法读取文件问题求助

问题分析与解决方案

核心问题点

  1. 错误的文件路径:直接使用"user.txt"会指向Android应用的当前工作目录(通常是app的私有数据目录,并非你期望的外部存储位置),导致无法定位目标文件。
  2. 缺少动态权限申请:Android 6.0(API 23)及以上版本,仅在AndroidManifest.xml中声明存储权限不够,必须在代码中主动请求用户授权。
  3. 未明确指定合法存储路径:需通过Android官方API获取标准的外部存储目录,而非使用相对路径。

具体修复步骤

1. 修正文件读取逻辑(Database类)

修改Database类,通过上下文获取正确的存储路径,并将静态方法改为实例方法以便接收上下文:

package com.example.game;

import android.content.Context;
import android.os.Environment;
import android.util.Log;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class Database {
    private static final String TAG = "Database";
    private Context mContext;

    public Database(Context context) {
        mContext = context;
    }

    public void readUserFile() {
        // 方式1:使用App私有外部存储(无需动态权限,Android 10+推荐)
        // File userFile = new File(mContext.getExternalFilesDir(null), "user.txt");
        
        // 方式2:使用外部存储公共目录(需要动态权限)
        File userFile = new File(Environment.getExternalStorageDirectory(), "user.txt");
        
        try (FileReader fr = new FileReader(userFile)) {
            Log.d(TAG, "文件读取成功");
            // 此处可添加文件内容读取逻辑
        } catch (IOException e) {
            Log.e(TAG, "读取失败: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

2. 添加动态权限申请(MainActivity类)

在MainActivity中先检查并申请存储权限,再执行文件读取操作:

package com.example.game;

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.Window;
import android.widget.Toast;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

public class MainActivity extends Activity {
    private static final int REQUEST_STORAGE_PERM = 1001;
    private Database db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main_activity);

        db = new Database(this);
        checkStoragePermission();
    }

    private void checkStoragePermission() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    REQUEST_STORAGE_PERM);
        } else {
            db.readUserFile();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_STORAGE_PERM) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                db.readUserFile();
            } else {
                Toast.makeText(this, "需要存储权限才能读取文件", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

3. 额外适配与注意事项

  • Android 10+ 公共存储适配:若使用公共外部存储,需在AndroidManifest.xml的<application>标签中添加android:requestLegacyExternalStorage="true"(适配Android 10),或采用Scoped Storage方案(Android 11+推荐)。
  • 文件位置确认:
    • 私有外部存储路径:/sdcard/Android/data/com.example.game/files/user.txt
    • 公共存储路径:/sdcard/user.txt
      确保你的user.txt文件确实存放在对应路径下。
  • 权限声明补充:确保AndroidManifest.xml中已添加完整权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> <!-- Android 11+ 访问公共目录需添加 -->

内容的提问来源于stack exchange,提问作者Deadli_wolf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 08:10:23