【问题标题】:How to make sure all the lines/records are read in S3Object如何确保在 S3Object 中读取所有行/记录
【发布时间】:2021-08-02 11:32:12
【问题描述】:

我编写了一个从 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;
    }

【问题讨论】:

  • 有什么理由不能将项目放入 JSON 数组而不是使用 NDJSON?
  • 感谢您的回复。将项目放入 JSON 数组是什么意思?你会更具体吗?我使用 map 的原因是很容易根据 key 获取值。

标签: java amazon-s3 buffer bufferedreader reader


【解决方案1】:

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

我觉得很好1

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

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

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

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

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

如果您获得的行数比您预期的要少,则 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

【讨论】:

    猜你喜欢
    • 2014-12-13
    • 2019-07-04
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多