我正在使用javaamazonawsdk执行一些从hdfs到s3的多部分上传。我的代码如下:
for (int i = startingPart; currentFilePosition < contentLength ; i++)
{
FSDataInputStream inputStream = fs.open(new Path(hdfsFullPath));
// Last part can be less than 5 MB. Adjust part size.
partSize = Math.min(partSize, (contentLength - currentFilePosition));
// Create request to upload a part.
UploadPartRequest uploadRequest = new UploadPartRequest()
.withBucketName(bucket).withKey(s3Name)
.withUploadId(currentUploadId)
.withPartNumber(i)
.withFileOffset(currentFilePosition)
.withInputStream(inputStream)
.withPartSize(partSize);
// Upload part and add response to our list.
partETags.add(s3Client.uploadPart(uploadRequest).getPartETag());
currentFilePosition += partSize;
inputStream.close();
lastFilePosition = currentFilePosition;
}
但是,上传的文件与原来的不一样。更具体地说,我正在测试一个测试文件,它大约有20MB。我上传的部分是5 mb每个。在每个5mb部分的末尾,我看到一些额外的文本,总是96个字符长。
更奇怪的是,如果我在.withfileoffset()中添加了一些愚蠢的东西,
.withFileOffset(currentFilePosition-34)
错误保持不变。我本来希望得到其他字符,但我得到了确切的96个额外字符,好像我没有修改行。
有什么问题吗?
谢谢,塞尔维亚人
1条答案
按热度按时间bjp0bcyl1#
我想出来了。这是我一个愚蠢的假设。结果是,“.withfileoffset(…)”中的文件偏移量告诉您在目标文件中写入的偏移量。它没有说任何关于源头的事。通过重复地打开和关闭流,我总是从文件的开头开始写入,但是写入的偏移量不同。解决方案是在打开流后添加seek语句: