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