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

Android Studio使用OpenCSV读CSV遇FileNotFoundException求助

Android中使用OpenCSV读取assets文件报错解决方案

问题描述

在Android Studio中使用OpenCSV读取teste.csv时,抛出java.io.FileNotFoundException: teste.csv: open failed: ENOENT (No such file or directory)错误。文件已放置在assets和res/raw目录,Android Studio能识别,但运行时报错。

环境配置

  • Windows 10
  • Android Studio Dolphin | 2021.3.1 Patch 1
  • 项目类型:无Activity
  • OpenCSV版本:5.7.1

错误日志

2022-12-18 15:39:15.232 13198-13198 System.err              com.example.testecsv                 W  java.io.FileNotFoundException: teste.csv: open failed: ENOENT (No such file or directory)
2022-12-18 15:39:15.280 13198-13198 System.err              com.example.testecsv                 W      at libcore.io.IoBridge.open(IoBridge.java:574)
2022-12-18 15:39:15.281 13198-13198 System.err              com.example.testecsv                 W      at java.io.FileInputStream.<init>(FileInputStream.java:160)
2022-12-18 15:39:15.283 13198-13198 System.err              com.example.testecsv                 W      at java.io.FileInputStream.<init>(FileInputStream.java:115)
2022-12-18 15:39:15.284 13198-13198 System.err              com.example.testecsv                 W      at java.io.FileReader.<init>(FileReader.java:60)
2022-12-18 15:39:15.285 13198-13198 System.err              com.example.testecsv                 W      at com.example.testecsv.MainActivity.onCreate(MainActivity.java:25)
2022-12-18 15:39:15.289 13198-13198 System.err              com.example.testecsv                 W      at android.app.Activity.performCreate(Activity.java:8305)
2022-12-18 15:39:15.289 13198-13198 System.err              com.example.testecsv                 W      at android.app.Activity.performCreate(Activity.java:8284)
2022-12-18 15:39:15.290 13198-13198 System.err              com.example.testecsv                 W      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1417)
2022-12-18 15:39:15.291 13198-13198 System.err              com.example.testecsv                 W      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3626)
2022-12-18 15:39:15.292 13198-13198 System.err              com.example.testecsv                 W      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3782)
2022-12-18 15:39:15.292 13198-13198 System.err              com.example.testecsv                 W      at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101)
2022-12-18 15:39:15.293 13198-13198 System.err              com.example.testecsv                 W      at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
2022-12-18 15:39:15.296 13198-13198 System.err              com.example.testecsv                 W      at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
2022-12-18 15:39:15.298 13198-13198 System.err              com.example.testecsv                 W      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307)
2022-12-18 15:39:15.299 13198-13198 System.err              com.example.testecsv                 W      at android.os.Handler.dispatchMessage(Handler.java:106)
2022-12-18 15:39:15.301 13198-13198 System.err              com.example.testecsv                 W      at android.os.Looper.loopOnce(Looper.java:201)
2022-12-18 15:39:15.301 13198-13198 System.err              com.example.testecsv                 W      at android.os.Looper.loop(Looper.java:288)
2022-12-18 15:39:15.302 13198-13198 System.err              com.example.testecsv                 W      at android.app.ActivityThread.main(ActivityThread.java:7872)
2022-12-18 15:39:15.304 13198-13198 System.err              com.example.testecsv                 W      at java.lang.reflect.Method.invoke(Native Method)
2022-12-18 15:39:15.306 13198-13198 System.err              com.example.testecsv                 W      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
2022-12-18 15:39:15.308 13198-13198 System.err              com.example.testecsv                 W      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
2022-12-18 15:39:15.314 13198-13198 System.err              com.example.testecsv                 W  Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
2022-12-18 15:39:15.316 13198-13198 System.err              com.example.testecsv                 W      at libcore.io.Linux.open(Native Method)
2022-12-18 15:39:15.316 13198-13198 System.err              com.example.testecsv                 W      at libcore.io.ForwardingOs.open(ForwardingOs.java:563)
2022-12-18 15:39:15.317 13198-13198 System.err              com.example.testecsv                 W      at libcore.io.BlockGuardOs.open(BlockGuardOs.java:274)
2022-12-18 15:39:15.318 13198-13198 System.err              com.example.testecsv                 W      at libcore.io.ForwardingOs.open(ForwardingOs.java:563)
2022-12-18 15:39:15.318 13198-13198 System.err              com.example.testecsv                 W      at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:7758)
2022-12-18 15:39:15.322 13198-13198 System.err              com.example.testecsv                 W      at libcore.io.IoBridge.open(IoBridge.java:560)
2022-12-18 15:39:15.324 13198-13198 System.err              com.example.testecsv                 W      ... 20 more

原代码问题

原代码中使用FileReader("teste.csv")尝试读取assets文件,但Android的assets文件打包在APK内,并非存放在设备文件系统路径中,直接用FileReader无法访问,这是报错的核心原因。用户已能通过BufferedReader正常读取assets文件,只需将其与OpenCSV结合即可。

错误代码片段:

CSVReader reader = new CSVReaderBuilder(new FileReader("teste.csv")).build();

解决方案

将FileReader替换为读取assets流的BufferedReader,传递给CSVReaderBuilder即可。修正后的完整代码:

package com.example.testecsv;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import com.opencsv.CSVReader;
import com.opencsv.CSVReaderBuilder;
import com.opencsv.exceptions.CsvValidationException;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        try {
            // 读取assets中的CSV文件
            BufferedReader br = new BufferedReader(new InputStreamReader(getAssets().open("teste.csv"), "UTF-8"));
            // 将BufferedReader传入OpenCSV的构造器
            CSVReader reader = new CSVReaderBuilder(br).build();
            
            String[] nextLine;
            while ((nextLine = reader.readNext()) != null) {
                // 处理每行CSV数据
                System.out.println(nextLine[0] + " " + nextLine[1] + " etc...");
            }
            
            // 关闭资源避免泄漏
            reader.close();
            br.close();

        } catch (IOException e) {
            e.printStackTrace();
        } catch (CsvValidationException e) {
            e.printStackTrace();
        }
    }
}

关键说明

  • Android的assets文件无法通过文件系统路径直接访问,必须通过AssetManager获取输入流。
  • OpenCSV的CSVReaderBuilder支持接收任意Reader类型实例,包括InputStreamReader和BufferedReader,直接传入读取assets的流包装即可。
  • 使用完毕后需关闭相关流和CSVReader,避免资源泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 13:50:45