如何确保在 S3Object 中读取所有行/记录

时间:2021-05-12 05:48:00

标签: java amazon-s3 buffer bufferedreader reader

我写了一个从 S3 对象读取信息的方法。 S3Object 中有多个记录,读取所有行的最佳方法是什么。它是否只读取对象的第一行?如何确保读取所有行?任何人都可以提供一些建议吗?

while ((line = reader.readLine()) != null) {
            map = objectMapper.readValue(line, new TypeReference<Map<String, Object>>() {});

 public Map<String, Object> readS3ObjectData(@NonNull S3Object s3Object) throws IOException {
        S3ObjectInputStream s3InputStream = s3Object.getObjectContent();
        BufferedReader reader = new BufferedReader(new InputStreamReader(s3InputStream, StandardCharsets.UTF_8));
        String line = "";
        Map<String, Object> map = new HashMap<>();
        while ((line = reader.readLine()) != null) {
            map = objectMapper.readValue(line, new TypeReference<Map<String, Object>>() {});
            LOGGER.info("Create Object mapper successfully");
        }
        reader.close();
        s3InputStream.close();
        return map;
    }

1 个答案:

答案 0 :(得分:2)

<块引用>

我写了一个从 S3 对象读取信息的方法。

我觉得不错1

<块引用>

S3Object 中有多个记录,读取所有行的最佳方法是什么。

您的代码应该读取所​​有行。

<块引用>

它是否只读取对象的第一行?

没有。它应该读取所​​有的行2。该 AX 循环一直读取直到 while 返回 readLine(),而且只有在您到达流的末尾时才会发生这种情况。

<块引用>

如何确保所有行都被读取?

如果您得到的行数比预期的少,要么是 S3 对象包含的行数比您想象的少,要么是某些原因导致对象流过早关闭。

对于前者,在阅读时计算行数,并将其与预期的行数进行比较。

后者可能是由于读取非常大的文件时超时。有关如何处理该问题的一些想法,请参阅 How to read file chunk by chunk from S3 using aws-java-sdk


1 - 实际上,如果您使用 try with resources 来确保 S3 流始终关闭会更好。但这不会导致您“丢失”线路。
2 - 这假设 S3 服务不会使连接超时,并且您没有请求 URI 请求参数中的一部分(块)或范围;见https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html