我正在尝试从S3读取一个非常大的文件(几乎1 GB)。但是,getobject无法读取文件,并显示错误
警告:并非从S3ObjectInputStream读取所有字节,从而中止HTTP连接。这可能是一个错误,并且可能导致次佳的行为。通过远程GET仅请求所需的字节,或在使用后耗尽输入流。
我检查了几篇文章,发现s3ObjectInputStream.abort()可以解决此问题。但这仍然无济于事。
S3Object sourceS3Object = null;
S3ObjectInputStream s3ObjectInputStream=null;
InputStream reader = null;
ObjectMetadata metadata = null;
int retries = 10;
while (retries > 0) {
try {
sourceS3Object = sourceS3Client.getObject(sourceS3Uri.getBucket(), sourceS3Uri.getKey());
s3ObjectInputStream = sourceS3Object.getObjectContent();
reader = new BufferedInputStream(s3ObjectInputStream);
} catch (Exception readingException) {
retries--;
System.out.println(readingException);
System.out.println(readingException.getStackTrace().toString());
readingException.printStackTrace();
if (s3ObjectInputStream != null) {
s3ObjectInputStream.abort();
}
sourceS3Object = sourceS3Client.getObject(sourceS3Uri.getBucket(), sourceS3Uri.getKey());
s3ObjectInputStream = sourceS3Object.getObjectContent();
} finally {
if (retries == 0) {
System.out.println("Out of retries");
}
}
}
对于较小的文件,复制成功,但是对于较大的文件,它会向我发出此警告
答案 0 :(得分:0)
该警告提到,该文件已关闭而不读取整个文件。 在您的代码中提到,
if (s3ObjectInputStream != null) {
s3ObjectInputStream.abort();
}
s3ObjectInputstream存储文件内容,并且在不读取整个文件的情况下将其中止。因此代码应为:
if (s3ObjectInputStream == null) {
s3ObjectInputStream.abort();
}
答案 1 :(得分:0)
有点迟了,但是有一个明显的问题需要解决。
您需要从catch (Exception readingException) {
块中删除这两行:
sourceS3Object = sourceS3Client.getObject(sourceS3Uri.getBucket(), sourceS3Uri.getKey());
s3ObjectInputStream = sourceS3Object.getObjectContent();
这是因为发生异常时,您可以这样做:
...
s3ObjectInputStream = sourceS3Object.getObjectContent();
,然后再次循环。循环所做的第一件事是相同的:
...
s3ObjectInputStream = sourceS3Object.getObjectContent();
因此您的程序两次获取内容流,但仅读取一次内容。您需要从Exception块中删除这两行:
您的循环也会永远运行,我希望这意味着您只是为示例剥离了一些代码。