如果您只需获取对象中的部分数据,您可以使用范围下载,下载指定范围内的数据。本文介绍 TOS Java SDK 的范围下载功能。
tos:GetObject
权限,具体操作,请参见权限配置指南。tos:GetObjectVersion
权限,具体操作,请参见权限配置指南。以下代码展示如何指定范围的起始位置(rangeStart)和结束位置(rangeEnd)参数下载目标桶 bucket-example
中的 example_dir
目录下的 example_object.txt
文件到本地。
rangeStart 和 rangeEnd 参数遵循 HTTP 的 'Range' 头域规范。比如 rangeStart=1,rangeEnd=10,代表下载对象的第 1 个字节到第 10 个字节总共 11 字节的数据,详情可参见 HTTP range requests。
import com.volcengine.tos.TOSV2; import com.volcengine.tos.TOSV2ClientBuilder; import com.volcengine.tos.TosClientException; import com.volcengine.tos.TosServerException; import com.volcengine.tos.model.object.GetObjectV2Input; import com.volcengine.tos.model.object.GetObjectV2Output; import com.volcengine.tos.model.object.ObjectMetaRequestOptions; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class GetObjectRangeExample { public static void main(String[] args) { String endpoint = "your endpoint"; String region = "your region"; String accessKey = System.getenv("TOS_ACCESS_KEY"); String secretKey = System.getenv("TOS_SECRET_KEY"); String bucketName = "bucket-example"; // 对象名 String objectKey = "example_dir/example_object.txt"; // 对象数据保存的本地文件路径,需保证不存在,否则会覆盖原有文件 String filePath = "example_dir/example_file.txt"; TOSV2 tos = new TOSV2ClientBuilder().build(region, endpoint, accessKey, secretKey); File file = new File(filePath); if (file.getParentFile() != null && !file.getParentFile().exists()) { // 此处判断文件路径的父文件夹是否存在,不存在则创建父文件夹 // 如果父文件夹不存在且不创建,直接写入会报 FileNotFoundException file.getParentFile().mkdirs(); } // 以下代码展示如何下载数据的 [0-1023] 字节到本地文件,总共 1024 字节 long rangeStart = 0; long rangeEnd = 1023; ObjectMetaRequestOptions options = new ObjectMetaRequestOptions().setRange(rangeStart, rangeEnd); GetObjectV2Input input = new GetObjectV2Input().setBucket(bucketName).setKey(objectKey).setOptions(options); try(FileOutputStream fos = new FileOutputStream(file); GetObjectV2Output output = tos.getObject(input)) { if (output.getContent() != null) { byte[] buffer = new byte[4096]; int length; while ((length = output.getContent().read(buffer)) != -1) { fos.write(buffer, 0, length); } } fos.flush(); System.out.println("getObject succeed, object's contentRange is " + output.getContentRange()); } catch (IOException e) { System.out.println("write data to file failed"); e.printStackTrace(); } catch (TosClientException e) { // 操作失败,捕获客户端异常,一般情况是请求参数错误,此时请求并未发送 System.out.println("getObject failed"); System.out.println("Message: " + e.getMessage()); if (e.getCause() != null) { e.getCause().printStackTrace(); } } catch (TosServerException e) { // 操作失败,捕获服务端异常,可以获取到从服务端返回的详细错误信息 System.out.println("getObject failed"); System.out.println("StatusCode: " + e.getStatusCode()); System.out.println("Code: " + e.getCode()); System.out.println("Message: " + e.getMessage()); System.out.println("RequestID: " + e.getRequestID()); } catch (Throwable t) { // 作为兜底捕获其他异常,一般不会执行到这里 System.out.println("getObject failed"); System.out.println("unexpected exception, message: " + t.getMessage()); } } }
关于下载对象的 API 文档,请参见 GetObject。