Java创建CSV文件抛出FileNotFoundException异常如何解决
问题根源
报错是因为生成的文件名包含操作系统禁止用作文件名的特殊字符:你定义的日期格式MM/dd/yyyy-HH:mm:ssZ中的/会被Windows、Unix类系统识别为路径分隔符,系统会尝试寻找08目录下的23子目录来存放文件,对应目录不存在就会抛出FileNotFoundException。此外Windows系统也不允许文件名中出现:,也会触发相同报错。
修复步骤
- 修改日期格式化规则,将
/、:替换为允许的字符,如短横线-、下划线_ - 可选优化:新增父目录自动创建逻辑,避免指定存储路径时父目录不存在的问题;使用try-with-resources语法自动管理IO流,避免资源泄漏
- 额外提示:原代码表头包含
logoUrl字段,但实际写入行时漏写该字段,会导致CSV列数不匹配,建议同步修复 - 如果后续不需要保留本地文件,可直接将CSV内容写入内存输出流后直接上传S3,完全规避本地文件操作的各类问题
修正后代码示例
// 替换日期格式中的非法文件名字符 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd-yyyy-HH_mm_ssZ"); String formattedString = zonedDateTime.format(formatter); String fileName = formattedString + "partner" + ".csv"; File newFile = new File(fileName); // 若需要指定存储路径而非当前工作目录,可替换为以下写法 // File newFile = new File("/your/custom/path/" + fileName); // 自动创建不存在的父目录 if (newFile.getParentFile() != null) { newFile.getParentFile().mkdirs(); } // try-with-resources自动关闭IO流 try (BufferedWriter writer = new BufferedWriter(new FileWriter(newFile))) { writer.write("id,name,logoUrl,status,ctime,mtime\n"); for(Partner partner : partners){ System.out.println(partner.getId() + " " + partner.getName()); // 补全漏写的logoUrl字段 writer.write(partner.getId()+","+partner.getName()+","+partner.getLogoUrl()+","+partner.getStatus()+","+partner.getCtime()+","+partner.getMtime()+"\n"); } } catch (IOException e) { // 按需添加异常处理逻辑 e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者aaaaaajib
相关产品推荐
相关产品推荐

