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

Android读取指定路径CSV文件无报错但不显示内容问题求助

Android外部存储CSV读取无内容问题排查与解决

问题分析

读取外部存储CSV无报错但不显示内容,而Assets目录文件可正常加载,大概率是权限缺失、路径错误或代码逻辑漏洞导致,以下是针对性解决步骤:


1. 补全存储权限(核心原因)

Android 6.0(API 23)及以上,仅Manifest静态权限不足以访问外部存储,需动态申请:

  • 添加静态权限到AndroidManifest.xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- Android 13+无需WRITE权限,低版本可保留 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
  • 动态申请权限并执行读取逻辑
    将读取CSV的代码封装为方法,权限通过后调用:
// 检查权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 100);
} else {
    readCsvFile();
}

// 权限回调处理
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 100) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            readCsvFile();
        } else {
            Toast.makeText(this, "需要存储权限才能加载CSV文件", Toast.LENGTH_SHORT).show();
        }
    }
}

2. 验证文件路径有效性

Environment.getExternalStorageDirectory()在Android 10(API 29)及以上已废弃,直接拼接路径可能找不到文件:

  • 读取前检查文件是否存在
File sdCard = Environment.getExternalStorageDirectory();
File dir = new File(sdCard.getAbsolutePath() + "/dl");
File cert = new File(dir,"m.csv");

if (!cert.exists()) {
    Log.d("iii", "文件不存在,路径:" + cert.getAbsolutePath());
    return;
}
  • 改用API推荐路径(API 29+无需动态权限)
// 应用私有外部存储目录
File dir = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
File cert = new File(dir, "m.csv");

3. 修正代码逻辑漏洞

原代码存在变量覆盖、对象重复引用问题,导致显示异常:

  • 每次循环覆盖s变量,最终仅显示最后一个token内容;
  • 重复添加同一个dt对象到列表,导致数据全部重复。

修改后的读取逻辑:

private void readCsvFile() {
    try {
        File sdCard = Environment.getExternalStorageDirectory();
        File dir = new File(sdCard.getAbsolutePath() + "/dl");
        File cert = new File(dir,"m.csv");
        
        if (!cert.exists()) {
            Log.d("iii", "文件不存在:" + cert.getAbsolutePath());
            return;
        }

        InputStream sl = new BufferedInputStream(new FileInputStream(cert));
        BufferedReader reader=new BufferedReader(new InputStreamReader(sl,Charset.forName("UTF-8")));

        String line="";
        while((line=reader.readLine())!=null){
            String[] token = line.split(",");
            StringBuilder contentSb = new StringBuilder();
            
            for(int i=0;i<token.length;i++){
                contentSb.append(token[i]).append("-");
                if(token[i].length()>15){
                    contentSb.append("---");
                }
            }
            String showText = contentSb.toString() + "token lrn" + token.length;
            tv.setText(showText);
            
            // 创建新对象添加到列表,避免重复引用
            WeatherData newDt = new WeatherData(); // 替换为你的自定义类
            newDt.sets2(contentSb.toString());
            weathersam.add(newDt);
        }
        reader.close();
        sl.close();
    }catch(Exception e){
        Log.d("iii", e.getClass().getSimpleName() + ": " + e.getMessage());
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:47:48