Java 从AWS s3文件中读取N个字节不会读取N个字节
我试图从AWS S3 bucket中的文件中读取N个字节并将其写入缓冲区,但是当我尝试这样做时,返回的字节数不是N,而是少得多,并且在多次调用后它会有所不同 我正在做的是:Java 从AWS s3文件中读取N个字节不会读取N个字节,java,amazon-web-services,amazon-s3,aws-java-sdk,Java,Amazon Web Services,Amazon S3,Aws Java Sdk,我试图从AWS S3 bucket中的文件中读取N个字节并将其写入缓冲区,但是当我尝试这样做时,返回的字节数不是N,而是少得多,并且在多次调用后它会有所不同 我正在做的是: public int readData(byte[] data, int doff, long offset, int length, String bucketName, String fileName) throws IOException { GetObjectRequest rangeObjectReques
public int readData(byte[] data, int doff, long offset, int length, String bucketName, String fileName) throws IOException {
GetObjectRequest rangeObjectRequest = new GetObjectRequest(bucketName, fileName)
.withRange(offset, length);
S3Object objectPortion = S3_CLIENT.getObject(rangeObjectRequest);
return objectPortion.getObjectContent().read(data, doff, length);
}
当offset=0
和length=32752
objectPortion.getObjectContent().read(data, doff, length);
返回16360
,而数据
大小为32820,足以容纳我需要的所有数据
为什么会这样?为什么它不返回所有数据
我试图下载的文件大小约为69kb请使用此片段阅读全部内容:
try(S3ObjectInputStream=ObjectPart.getObjectContent()){
字节[]buf=新字节[4096];
int read=0;
而((read=is.read(buf))>=0){
//使用buf/读取值
}
}捕获(例外e){
…
}
InputStream.read()
的工作方式与您想象的不同:“尝试读取尽可能多的len字节,但可能读取较小的数”。你需要在一个循环中阅读,你会在这个网站上发现许多类似的问题。反复调用read()
,积累返回的数据,直到返回值-1,表示流结束。我做了一些类似的事情,但出于某种原因,我发现这会导致无限循环。read()在所有内容都已读取且您未读取文件的最后部分后,结果为0。因此,需要进行一些检查。