【问题标题】:java.io.FileNotFoundException (Read-only file system) // Uploading files to S3java.io.FileNotFoundException (只读文件系统) // 上传文件到 S3
【发布时间】:2020-02-27 19:52:01
【问题描述】:

我正在尝试从地图列表创建 csv 文件,并通过 lambda 函数将它们上传到 S3 存储桶。以下是代码:

public void createCSV(List<Map<String, AttributeValue>> changedRecords, Context context, String tableName)
            throws IOException {
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
        String outputName = tableName + "_" + formatter.format(calendar.getTime()) + ".csv";

        List<String> headers = changedRecords.stream().flatMap(map -> map.keySet().stream()).distinct()
                .collect(Collectors.toList());

        try (FileWriter writer = new FileWriter(outputName, true);) {
            for (String string : headers) {
                writer.write(string);
                writer.write(",");
            }
            writer.write("\r\n");
            for (Map<String, AttributeValue> lmap : changedRecords) {
                for (Entry<String, AttributeValue> string2 : lmap.entrySet()) {
                    writer.write(string2.getValue().getS());
                    writer.write(",");
                }
                writer.write("\r\n");
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        s3.putObject(new PutObjectRequest("bucket_name", "data/" + outputName, outputName));
    }

得到以下fileNotFound异常:

java.io.FileNotFoundException: data_20200227192207.csv(只读文件 系统) 在 java.io.FileOutputStream.open0(本机方法) 在 java.io.FileOutputStream.open(FileOutputStream.java:270) 在 java.io.FileOutputStream.(FileOutputStream.java:213) 在 java.io.FileOutputStream.(FileOutputStream.java:133) 在 java.io.FileWriter.(FileWriter.java:78) 在 com.amazonaws.lambda.demo.PLMLambda.createCSV(PLMLambda.java:84) 在 com.amazonaws.lambda.demo.PLMLambda.handleRequest(PLMLambda.java:54) 在 com.amazonaws.lambda.demo.PLMLambda.handleRequest(PLMLambda.java:1) 在 lambdainternal.EventHandlerLoader$PojoHandlerAsStreamHandler.handleRequest(EventHandlerLoader.java:178) 在 lambdainternal.EventHandlerLoader$2.call(EventHandlerLoader.java:906) 在 lambdainternal.AWSLambda.startRuntime(AWSLambda.java:341) 在 lambdainternal.AWSLambda.(AWSLambda.java:63) 在 java.lang.Class.forName0(本机方法) 在 java.lang.Class.forName(Class.java:348) 在 lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:114)

【问题讨论】:

    标签: amazon-s3 aws-lambda aws-java-sdk aws-java-sdk-dynamodb


    【解决方案1】:

    换行:

    try (FileWriter writer = new FileWriter(outputName, true);) {
    

    try (FileWriter writer = new FileWriter("/tmp" + outputName, true);) {
    

    在 Lambda 中,您只能写入 /tmp 目录。

    【讨论】:

    • 次要,但使用Paths.get("/tmp", outputName) 可能比字符串连接更好。
    • 谢谢。该文件是否会自动从此 tmp 目录中删除?
    • 一个Lambda实例被复用,文件在tmp目录下。但是 AWS 不保证它,所以不要假设文件总是在那里可以重复使用。如果 lambda 实例被终止,文件也会被删除。
    【解决方案2】:

    如果你的 CSV 内容不是很大(比如 4GB),你可以简单地使用 StringWriter 而不是 FileWriter 和 AWS Lambda,然后直接将字符串放到 S3 中。

    【讨论】:

      猜你喜欢
      • 2020-04-26
      • 2015-01-02
      • 2015-01-22
      • 2014-04-19
      • 2019-09-30
      • 2012-12-08
      • 1970-01-01
      • 1970-01-01
      • 2016-08-04
      相关资源
      最近更新 更多