Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从AWS s3文件中读取N个字节不会读取N个字节_Java_Amazon Web Services_Amazon S3_Aws Java Sdk - Fatal编程技术网

Java 从AWS s3文件中读取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

我试图从AWS S3 bucket中的文件中读取N个字节并将其写入缓冲区,但是当我尝试这样做时,返回的字节数不是N,而是少得多,并且在多次调用后它会有所不同

我正在做的是:

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。因此,需要进行一些检查。