Android开发中Java代码无法读取文件问题求助
问题分析与解决方案
核心问题点
- 错误的文件路径:直接使用
"user.txt"会指向Android应用的当前工作目录(通常是app的私有数据目录,并非你期望的外部存储位置),导致无法定位目标文件。 - 缺少动态权限申请:Android 6.0(API 23)及以上版本,仅在
AndroidManifest.xml中声明存储权限不够,必须在代码中主动请求用户授权。 - 未明确指定合法存储路径:需通过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
相关产品推荐
相关产品推荐

