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

AWS Lambda Java程序无法向创建的TXT文件写入内容求助

问题根源与修复方案

核心问题

空文件问题的本质是BufferedWriter的缓冲区数据未写入磁盘就执行读取/上传操作。BufferedWriter会将数据暂存于内存缓冲区,只有当缓冲区满、调用flush()或关闭流时,才会把数据写入磁盘。你的代码写完URL后直接用BufferedReader读取文件,此时数据还在内存中,磁盘文件为空,因此FL2日志显示null,上传到S3的文件也为空。

另外代码存在换行符写法错误:bw.write(" ");是无效语法,需替换为标准换行方式。

修复步骤

  1. 写完数据后先刷新/关闭写流:在读取文件和上传S3前,必须确保缓冲区数据写入磁盘。可调用bw.flush(),或直接关闭写流(关闭时会自动触发flush)。
  2. 简化流的关闭逻辑:BufferedWriter的close()方法会自动关闭底层FileWriter,无需单独关闭FileWriter,避免重复关闭引发异常。
  3. 修正换行符:用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:40:25