AWS Lambda Java程序无法向创建的TXT文件写入内容求助
问题根源与修复方案
核心问题
空文件问题的本质是BufferedWriter的缓冲区数据未写入磁盘就执行读取/上传操作。BufferedWriter会将数据暂存于内存缓冲区,只有当缓冲区满、调用flush()或关闭流时,才会把数据写入磁盘。你的代码写完URL后直接用BufferedReader读取文件,此时数据还在内存中,磁盘文件为空,因此FL2日志显示null,上传到S3的文件也为空。
另外代码存在换行符写法错误:bw.write(" ");是无效语法,需替换为标准换行方式。
修复步骤
- 写完数据后先刷新/关闭写流:在读取文件和上传S3前,必须确保缓冲区数据写入磁盘。可调用
bw.flush(),或直接关闭写流(关闭时会自动触发flush)。 - 简化流的关闭逻辑:BufferedWriter的
close()方法会自动关闭底层FileWriter,无需单独关闭FileWriter,避免重复关闭引发异常。 - 修正换行符:用
bw.newLine()替代无效换行写法,保证跨平台兼容性。
修改后的代码
for (Map.Entry<String, ArrayList<String>> entry : files.entrySet()) { String fileName = entry.getKey(); ArrayList<String> list = entry.getValue(); File file = new File(fileName); BufferedWriter bw = null; BufferedReader br = null; try { if (!file.exists()) { log.info("It doesn't exist as a temp."); if (!file.createNewFile()) { log.error(fileName + " not created. Skipping"); continue; } } // 直接初始化BufferedWriter,无需单独保留FileWriter引用 bw = new BufferedWriter(new FileWriter(file, StandardCharsets.UTF_8)); for (int i = 0; i < list.size(); i++) { String url = list.get(i); log.info("Inserting " + url + " into file " + fileName); if (i != 0) { // 使用newLine()生成标准换行符 bw.newLine(); } bw.write(url); } // 关键操作:先刷新并关闭写流,确保数据写入磁盘 bw.flush(); bw.close(); bw = null; // 标记为null,避免finally块重复关闭 // 此时读取文件即可获取真实内容 br = new BufferedReader(new FileReader(file, StandardCharsets.UTF_8)); log.info("FL2: " + br.readLine()); String key = fileName.substring(5); amazonS3.putObject("[bucketname]", key, file); } catch (Exception e) { e.printStackTrace(); } finally { try { if (bw != null) { bw.close(); } if (br != null) { br.close(); } } catch (IOException e) { e.printStackTrace(); } } } log.info("End of the sitemap generator");
额外优化建议
使用try-with-resources语法自动管理流,省去手动关闭的繁琐,同时避免资源泄漏:
try (BufferedWriter bw = new BufferedWriter(new FileWriter(file, StandardCharsets.UTF_8))) { // 写入URL的逻辑代码 } catch (IOException e) { e.printStackTrace(); } // 流会在代码块结束后自动关闭
内容的提问来源于stack exchange,提问作者Thutmose298
相关产品推荐
相关产品推荐

