Android Studio中创建CSV文件遇IOException:文件未创建即报错
问题分析与修复方案
问题根源
- 权限/路径异常:
FileWriter("ratings.csv")用相对路径时,若程序运行的当前工作目录无写入权限、路径无法创建文件,会直接抛出IOException - 异常信息无效:catch块只打印"Error",完全没法定位具体错误(比如权限不足、路径不存在、文件名非法等)
- 资源泄漏风险:直接调用
out.close(),如果write过程中抛异常,close可能不会执行,导致资源没释放 - 文件覆盖问题:每次调用
writeToFile都会清空原有文件,不能追加新数据
修复后的代码
import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; public class WriteCSV { private final String filePath; // 默认使用ratings.csv public WriteCSV() { this("ratings.csv"); } // 支持自定义文件路径 public WriteCSV(String filePath) { this.filePath = filePath; } // 核心写入方法,支持追加/覆盖模式 public void writeToFile(Movie movie, boolean append) { // try-with-resources自动关闭资源,不用手动写close try (BufferedWriter out = new BufferedWriter(new FileWriter(filePath, append))) { // 规范构建CSV行,处理特殊字符 String line = String.join(";", String.valueOf(movie.getId()), escapeSpecialChars(movie.getTitle()), String.valueOf(movie.getDuration()), escapeSpecialChars(movie.getImg()), String.valueOf(movie.getStars()) ); out.write(line); out.newLine(); // 每行一条数据,加换行符 } catch (IOException ex) { // 打印具体错误信息,方便排查 System.err.println("写入CSV失败: " + ex.getMessage()); ex.printStackTrace(); } } // 处理CSV字段里的特殊字符(分号、引号、换行等) private String escapeSpecialChars(String field) { if (field == null) return ""; // 字段包含特殊字符时,用双引号包裹,内部双引号转义 if (field.contains(";") || field.contains("\"") || field.contains("\n") || field.contains("\r")) { return "\"" + field.replace("\"", "\"\"") + "\""; } return field; } // 重载方法,默认追加模式 public void writeToFile(Movie movie) { writeToFile(movie, true); } }
关键优化点
- 路径灵活配置:增加带路径参数的构造方法,不用硬写文件名
- 自动资源管理:
try-with-resources语法保证资源必被关闭,避免泄漏 - 异常排查友好:打印具体错误信息和栈轨迹,快速定位问题
- CSV格式合规:处理特殊字段,避免因内容含分号导致CSV结构错乱
- 支持追加写入:默认追加模式,多次调用不会覆盖原有数据
调试建议
- 先打印当前工作目录,确认文件生成位置:
System.out.println("当前工作目录: " + System.getProperty("user.dir")); - 检查目标路径的写入权限,确保程序有权创建和修改文件
- IDE运行时,确认项目输出目录是否开放写入权限
内容的提问来源于stack exchange,提问作者OttoIEM
相关产品推荐
相关产品推荐

