java .io.FileNotFoundException (файловая система только для чтения) // Загрузка файлов на S3 - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь создать CSV-файлы из списка карт и загрузить их в корзину 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.amazon aws .lambda.demo.PLMLambda.createCSV ( PLMLambda. java: 84) в com.amazon aws .lambda.demo.PLMLambda.handleRequest (PLMLambda. java: 54) в com.amazon aws .lambda.demo.PLMLambda.handleRequest (PLMLambda. java: 1) в lambdainternal.EventHandlerLoader $ PojoHandlerAsStreamHandler.handleRequest (EventHandlerLoader. java: 178) в lambdainternal.EventHandlerLoader $ 2.call (EventHandlerLoain. *: 341) в lambdainternal.AWSLambda. (AWSLambda. java: 63) в * 102 9 * .lang.Class.forName0 (собственный метод) в java .lang.Class.forName (Class. java: 348) в lambdainternal.LambdaRTEntry.main (LambdaRTEntry. java: 114)

Ответы [ 2 ]

2 голосов
/ 28 февраля 2020

Измените строку:

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

на

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

В Lambda вы можете писать только в каталог /tmp.

1 голос
/ 28 февраля 2020

Если ваш CSV-контент не такой большой (например, 4 ГБ), вы можете просто использовать StringWriter вместо FileWriter с AWS Lambda, а затем просто поместить строку непосредственно в S3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...