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
相关产品推荐
相关产品推荐

