TOS 只有对象的概念,内部使用扁平结构存储数据。为方便您对对象进行分组并简化管理,您可以使用目录层次来组织对象。
TOS 只有对象的概念,可通过创建一个大小为 0 并且对象名以 /
结尾的对象,模拟目录的功能。
以下代码展示如何在桶 bucket-example
中创建目录 example_dir/
和子目录 example_dir/aaa/
。
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.PutObjectInput; import com.volcengine.tos.model.object.PutObjectOutput; public class CreateDirExample { 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 dir = "example_dir/"; String dir1 = "example_dir/aaa/"; TOSV2 tos = new TOSV2ClientBuilder().build(region, endpoint, accessKey, secretKey); try{ PutObjectInput putObjectInput = new PutObjectInput().setBucket(bucketName).setKey(dir).setContent(null); PutObjectOutput output = tos.putObject(putObjectInput); System.out.println("putObject succeed, object's etag is " + output.getEtag()); System.out.println("putObject succeed, object's crc64 is " + output.getHashCrc64ecma()); putObjectInput = new PutObjectInput().setBucket(bucketName).setKey(dir1).setContent(null); output = tos.putObject(putObjectInput); System.out.println("putObject succeed, object's etag is " + output.getEtag()); System.out.println("putObject succeed, object's crc64 is " + output.getHashCrc64ecma()); } catch (TosClientException e) { // 操作失败,捕获客户端异常,一般情况是请求参数错误,此时请求并未发送 System.out.println("putObject failed"); System.out.println("Message: " + e.getMessage()); if (e.getCause() != null) { e.getCause().printStackTrace(); } } catch (TosServerException e) { // 操作失败,捕获服务端异常,可以获取到从服务端返回的详细错误信息 System.out.println("putObject 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("putObject failed"); System.out.println("unexpected exception, message: " + t.getMessage()); } } }
通过 Delimiter
和 Prefix
两个参数可以模拟目录的功能:
Delimiter
为 /
同时设置 Prefix
为空, 可返回根目录下的对象和子目录信息。Delimiter
为 /
同时设置 Prefix
为子目录 commonPrefixes
, 可返回子目录的对象和次级目录。以下代码展示如何列举桶 bucket-example
目录 example_dir/
下的对象和子目录。
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.ListObjectsType2Input; import com.volcengine.tos.model.object.ListObjectsType2Output; import com.volcengine.tos.model.object.ListedCommonPrefix; import com.volcengine.tos.model.object.ListedObjectV2; public class ListDirExample { 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"; int maxKeys = 10; String delimiter = "/"; String prefix = "example_dir/"; TOSV2 tos = new TOSV2ClientBuilder().build(region, endpoint, accessKey, secretKey); try{ boolean isTruncated = true; String continuationToken = null; while (isTruncated) { ListObjectsType2Input input = new ListObjectsType2Input().setBucket(bucketName).setMaxKeys(maxKeys) .setDelimiter(delimiter).setPrefix(prefix).setContinuationToken(continuationToken); ListObjectsType2Output output = tos.listObjectsType2(input); System.out.printf("listObjectsType2 succeed, is truncated? %b, next continuation token is %s.\n", output.isTruncated(), output.getNextContinuationToken()); // 对象 if (output.getContents() != null) { for (int i = 0; i < output.getContents().size(); i++) { ListedObjectV2 object = output.getContents().get(i); System.out.printf("Listed object, key is %s, size is %d, storageClass is %s, ETag is %s, " + "last modified is %s, crc64 value is %s.\n", object.getKey(), object.getSize(), object.getStorageClass(), object.getEtag(), object.getLastModified().toString(), object.getHashCrc64ecma()); } } // 子目录 if (output.getCommonPrefixes() != null) { for (int i = 0; i < output.getCommonPrefixes().size(); i++) { ListedCommonPrefix commonPrefix = output.getCommonPrefixes().get(i); System.out.println("Listed commonPrefix is " + commonPrefix.getPrefix()); // commonPrefix 为子目录,可用其作为 prefix 参数继续往下列举 listCommonPrefix(bucketName, maxKeys, delimiter, commonPrefix.getPrefix(), tos); } } isTruncated = output.isTruncated(); continuationToken = output.getNextContinuationToken(); } } catch (TosClientException e) { // 操作失败,捕获客户端异常,一般情况是请求参数错误,此时请求并未发送 System.out.println("listObjectsType2 failed"); System.out.println("Message: " + e.getMessage()); if (e.getCause() != null) { e.getCause().printStackTrace(); } } catch (TosServerException e) { // 操作失败,捕获服务端异常,可以获取到从服务端返回的详细错误信息 System.out.println("listObjectsType2 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("listObjectsType2 failed"); System.out.println("unexpected exception, message: " + t.getMessage()); } } private static void listCommonPrefix(String bucketName, int maxKeys, String delimiter, String prefix, TOSV2 tos) { boolean isTruncated = true; String continuationToken = null; while (isTruncated) { ListObjectsType2Input input = new ListObjectsType2Input().setBucket(bucketName).setMaxKeys(maxKeys) .setDelimiter(delimiter).setContinuationToken(continuationToken).setPrefix(prefix); ListObjectsType2Output output = tos.listObjectsType2(input); System.out.printf("listObjectsType2 succeed, is truncated? %b, next continuation token is %s.\n", output.isTruncated(), output.getNextContinuationToken()); if (output.getContents() != null) { for (int i = 0; i < output.getContents().size(); i++) { ListedObjectV2 object = output.getContents().get(i); System.out.printf("Listed object, key is %s, size is %d, storageClass is %s, ETag is %s, " + "last modified is %s, crc64 value is %s.\n", object.getKey(), object.getSize(), object.getStorageClass(), object.getEtag(), object.getLastModified().toString(), object.getHashCrc64ecma()); } } if (output.getCommonPrefixes() != null) { for (int i = 0; i < output.getCommonPrefixes().size(); i++) { ListedCommonPrefix commonPrefix = output.getCommonPrefixes().get(i); System.out.println("Listed commonPrefix is " + commonPrefix.getPrefix()); // 此处可递归调用 // listCommonPrefix(bucketName, maxKeys, delimiter, commonPrefix.getPrefix(), tos); } } isTruncated = output.isTruncated(); continuationToken = output.getNextContinuationToken(); } } }
以下代码展示如何删除桶 bucket-example
目录 example_dir/
下的所有数据。
警告
以下代码中如果不设置 prefix
参数(即 prefix
为 null
)或设置 prefix = "" 空字符串,将会删除桶中所有对象数据,请谨慎检查使用!
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.DeleteObjectInput; import com.volcengine.tos.model.object.ListObjectsType2Input; import com.volcengine.tos.model.object.ListObjectsType2Output; public class DeleteDirExample { 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 prefix = "example_dir/"; TOSV2 tos = new TOSV2ClientBuilder().build(region, endpoint, accessKey, secretKey); try{ boolean isTruncated = true; String continuationToken = null; while (isTruncated) { ListObjectsType2Input input = new ListObjectsType2Input().setBucket(bucketName) .setPrefix(prefix).setContinuationToken(continuationToken); ListObjectsType2Output output = tos.listObjectsType2(input); if (output.getContents() != null){ for (int i = 0; i < output.getContents().size(); i++) { String objectKey = output.getContents().get(i).getKey(); DeleteObjectInput deleteInput = new DeleteObjectInput().setBucket(bucketName) .setKey(output.getContents().get(i).getKey()); tos.deleteObject(deleteInput); System.out.println("deleteObject succeed, deleted key is " + objectKey); } } isTruncated = output.isTruncated(); continuationToken = output.getNextContinuationToken(); } } catch (TosClientException e) { // 操作失败,捕获客户端异常,一般情况是请求参数错误,此时请求并未发送 System.out.println("deleteObject failed"); System.out.println("Message: " + e.getMessage()); if (e.getCause() != null) { e.getCause().printStackTrace(); } } catch (TosServerException e) { // 操作失败,捕获服务端异常,可以获取到从服务端返回的详细错误信息 System.out.println("deleteObject 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("deleteObject failed"); System.out.println("unexpected exception, message: " + t.getMessage()); } } }