Last update:2025-08-27 10:06:22
The WOS Java SDK provides comprehensive object management interfaces. This article introduces common operations for managing objects using these interfaces.
You can set object metadata, including custom user metadata, using WosClient.setObjectMetadata. The example below demonstrates how to set object metadata:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// Create WosClient instance
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
SetObjectMetadataRequest request = new SetObjectMetadataRequest("bucketname", "objectname");
request.addUserMetadata("property1", "property-value1");
// Set custom metadata
ObjectMetadata metadata = wosClient.setObjectMetadata(request);
System.out.println("\t" + metadata.getUserMetadata("property1"));
You can retrieve object metadata, including object size, MIME type, and custom user metadata, using WosClient.getObjectMetadata. The following example shows how to get object metadata:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// Create WosClient instance
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
ObjectMetadata metadata = wosClient.getObjectMetadata("bucketname", "objectname");
System.out.println("\t" + metadata.getContentType());
System.out.println("\t" + metadata.getContentLength());
System.out.println("\t" + metadata.getUserMetadata("property"));
You can retrieve the object’s access control list (ACL) using WosClient.getObjectAcl. The following example shows how to get an object’s ACL:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// Create WosClient instance
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
AccessControlList acl = wosClient.getObjectAcl("bucketname", "objectname");
System.out.println(acl);
You can list the objects in a bucket using WosClient.listObjects.
| Parameter | Description | Java SDK Method |
|---|---|---|
| bucketName | Bucket name | ListObjectsRequest.setBucketName |
| prefix | Returns objects whose names start with the specified prefix | ListObjectsRequest.setPrefix |
| marker | Starting point for listing. Returns objects ordered lexicographically after this marker | ListObjectsRequest.setMarker |
| maxKeys | Maximum number of objects to list (range: 1–1000; above 1000 defaults to 1000) | ListObjectsRequest.setMaxKeys |
| delimiter | Character for grouping object names. Returns common prefixes for objects that contain delimiter | ListObjectsRequest.setDelimiter |
The example below lists objects, with up to 1,000 results per request:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
// Create WosClient instance
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
ObjectListing result = wosClient.listObjects("bucketname");
for (WosObject wosObject : result.getObjects()) {
System.out.println("\t" + wosObject.getObjectKey());
System.out.println("\t" + wosObject.getOwner());
}
Notes:
ObjectListing.isTruncated is true. Use ObjectListing.getNextMarker for subsequent paginated requests.ListObjectsRequest request = new ListObjectsRequest("bucketname");
request.setMaxKeys(100);
ObjectListing result = wosClient.listObjects(request);
for (WosObject wosObject : result.getObjects()) {
System.out.println("\t" + wosObject.getObjectKey());
System.out.println("\t" + wosObject.getOwner());
}
ListObjectsRequest request = new ListObjectsRequest("bucketname");
request.setMaxKeys(100);
request.setPrefix("prefix");
ObjectListing result = wosClient.listObjects(request);
for (WosObject wosObject : result.getObjects()) {
System.out.println("\t" + wosObject.getObjectKey());
System.out.println("\t" + wosObject.getOwner());
}
ListObjectsRequest request = new ListObjectsRequest("bucketname");
request.setMaxKeys(100);
request.setMarker("test");
ObjectListing result = wosClient.listObjects(request);
for (WosObject wosObject : result.getObjects()) {
System.out.println("\t" + wosObject.getObjectKey());
System.out.println("\t" + wosObject.getOwner());
}
ListObjectsRequest request = new ListObjectsRequest("bucketname");
request.setMaxKeys(100);
ObjectListing result;
do {
result = wosClient.listObjects(request);
for (WosObject wosObject : result.getObjects()) {
System.out.println("\t" + wosObject.getObjectKey());
System.out.println("\t" + wosObject.getOwner());
}
request.setMarker(result.getNextMarker());
} while (result.isTruncated());
WOS does not support folders natively; objects are stored directly in the bucket. A folder is simulated by a zero-size object whose key ends with “/”. To list objects as if in a folder, specify the folder prefix:
ListObjectsRequest request = new ListObjectsRequest("bucketname");
request.setPrefix("dir/");
request.setMaxKeys(1000);
ObjectListing result;
do {
result = wosClient.listObjects(request);
for (WosObject wosObject : result.getObjects()) {
System.out.println("\t" + wosObject.getObjectKey());
System.out.println("\t" + wosObject.getOwner());
}
request.setMarker(result.getNextMarker());
} while (result.isTruncated());
ListObjectsRequest request = new ListObjectsRequest("bucketname");
request.setMaxKeys(1000);
// Set delimiter to "/"
request.setDelimiter("/");
ObjectListing result = wosClient.listObjects(request);
System.out.println("Objects in the root directory:");
for (WosObject wosObject : result.getObjects()) {
System.out.println("\t" + wosObject.getObjectKey());
System.out.println("\t" + wosObject.getOwner());
}
listObjectsByPrefix(wosClient, request, result);
static void listObjectsByPrefix(WosClient wosClient, ListObjectsRequest request, ObjectListing result) throws WosException {
for (String prefix : result.getCommonPrefixes()) {
System.out.println("Objects in folder [" + prefix + "]:");
request.setPrefix(prefix);
result = wosClient.listObjects(request);
for (WosObject wosObject : result.getObjects()) {
System.out.println("\t" + wosObject.getObjectKey());
System.out.println("\t" + wosObject.getOwner());
}
listObjectsByPrefix(wosClient, request, result);
}
}
Notes:
/ for each recursive call.ObjectListing.getObjects returns the objects in the current “folder”, and ObjectListing.getCommonPrefixes returns its subfolders.Delete a single object using WosClient.deleteObject:
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
wosClient.deleteObject("bucketname", "objectname");
Batch delete up to 1,000 objects per request using WosClient.deleteObjects:
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
DeleteObjectsRequest deleteRequest = new DeleteObjectsRequest("bucketname");
wosClient.deleteObjects(deleteRequest);
Copying an object in WOS creates a duplicate of an existing object.
Use WosClient.copyObject to copy an object. You can assign new metadata and permissions, and conditional copy is supported.
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
try {
CopyObjectResult result = wosClient.copyObject("sourcebucketname", "sourceobjectname", "destbucketname", "destobjectname");
System.out.println("\t" + result.getStatusCode());
System.out.println("\t" + result.getEtag());
} catch (WosException e) {
// Copy failed
System.out.println("HTTP Code: " + e.getResponseCode());
System.out.println("Error Code: " + e.getErrorCode());
System.out.println("Error Message: " + e.getErrorMessage());
System.out.println("Request ID: " + e.getErrorRequestId());
System.out.println("Host ID: " + e.getErrorHostId());
}
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
CopyObjectRequest request = new CopyObjectRequest("sourcebucketname", "sourceobjectname", "destbucketname", "destobjectname");
// Enable metadata replacement
request.setReplaceMetadata(true);
ObjectMetadata newObjectMetadata = new ObjectMetadata();
newObjectMetadata.setContentType("image/jpeg");
newObjectMetadata.addUserMetadata("property", "property-value");
newObjectMetadata.setObjectStorageClass(StorageClassEnum.WARM);
request.setNewObjectMetadata(newObjectMetadata);
CopyObjectResult result = wosClient.copyObject(request);
System.out.println("\t" + result.getEtag());
Note:
CopyObjectRequest.setReplaceMetadata(true) together with .setNewObjectMetadata.You can specify one or more conditions; copy occurs only if all conditions are met.
| Parameter | Description | Java SDK Method |
|---|---|---|
| Copy-Source-If-Modified-Since | Copies if the source object is modified later than the specified time; otherwise, exception | CopyObjectRequest.setIfModifiedSince |
| Copy-Source-If-Unmodified-Since | Copies if the source object is unmodified since the specified time; otherwise, exception | CopyObjectRequest.setIfUnmodifiedSince |
| Copy-Source-If-Match | Copies if the source object’s ETag matches the specified value; otherwise, exception | CopyObjectRequest.setIfMatchTag |
| Copy-Source-If-None-Match | Copies if the source object’s ETag does not match the specified value; otherwise, exception | CopyObjectRequest.setIfNoneMatchTag |
Notes:
Copy-Source-If-Modified-Since and Copy-Source-If-None-Match can be used together; Copy-Source-If-Unmodified-Since and Copy-Source-If-Match can be used together.WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
CopyObjectRequest request = new CopyObjectRequest("sourcebucketname", "sourceobjectname", "destbucketname", "destobjectname");
request.setIfModifiedSince(new SimpleDateFormat("yyyy-MM-dd").parse("2016-01-01"));
request.setIfNoneMatchTag("none-match-etag");
CopyObjectResult result = wosClient.copyObject(request);
System.out.println("\t" + result.getEtag());
Multipart copy is a special case of multipart upload, where each part is created by copying a part of an existing object. You can use WosClient.copyPart for this purpose. The example below demonstrates how to perform multipart copy for large objects:
String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";
final String destBucketName = "destbucketname";
final String destObjectKey = "destobjectname";
final String sourceBucketName = "sourcebucketname";
final String sourceObjectKey = "sourceobjectname";
// Create WosClient instance
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
// Initialize thread pool
ExecutorService executorService = Executors.newFixedThreadPool(20);
// Initiate multipart upload
InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(destBucketName, destObjectKey);
InitiateMultipartUploadResult result = wosClient.initiateMultipartUpload(request);
final String uploadId = result.getUploadId();
System.out.println("\t" + uploadId + "\n");
// Get source object info
ObjectMetadata metadata = wosClient.getObjectMetadata(sourceBucketName, sourceObjectKey);
// Copy 100MB per part
long partSize = 100 * 1024 * 1024L;
long objectSize = metadata.getContentLength();
// Calculate number of parts
long partCount = objectSize % partSize == 0 ? objectSize / partSize : objectSize / partSize + 1;
final List<PartEtag> partEtags = Collections.synchronizedList(new ArrayList<PartEtag>());
// Perform concurrent part copy
for (int i = 0; i < partCount; i++) {
// Range for each part
final long rangeStart = i * partSize;
final long rangeEnd = (i + 1 == partCount) ? objectSize - 1 : rangeStart + partSize - 1;
final int partNumber = i + 1;
executorService.execute(new Runnable() {
@Override
public void run() {
CopyPartRequest request = new CopyPartRequest();
request.setUploadId(uploadId);
request.setSourceBucketName(sourceBucketName);
request.setSourceObjectKey(sourceObjectKey);
request.setDestinationBucketName(destBucketName);
request.setDestinationObjectKey(destObjectKey);
request.setByteRangeStart(rangeStart);
request.setByteRangeEnd(rangeEnd);
request.setPartNumber(partNumber);
CopyPartResult result;
try {
result = wosClient.copyPart(request);
System.out.println("Part#" + partNumber + " done\n");
partEtags.add(new PartEtag(result.getEtag(), result.getPartNumber()));
} catch (WosException e) {
e.printStackTrace();
}
}
});
}
// Wait for completion
executorService.shutdown();
while (!executorService.isTerminated()) {
try {
executorService.awaitTermination(5, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// Complete multipart upload
CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest(destBucketName, destObjectKey, uploadId, partEtags);
wosClient.completeMultipartUpload(completeMultipartUploadRequest);