Microsoft Azure client library for Blob Storage - Azure Blob Storage is Microsoft's object storage solution for the cloud, optimized for storing massive amounts of unstructured data such as text or binary data.
—
Service clients provide the entry point for Azure Blob Storage operations, handling authentication, service-level configuration, and container management.
The synchronous client for Azure Blob Storage service operations.
import com.azure.storage.blob.BlobServiceClient;
import com.azure.storage.blob.BlobServiceClientBuilder;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.storage.common.StorageSharedKeyCredential;
// Using connection string (development/testing)
BlobServiceClient serviceClient = new BlobServiceClientBuilder()
.connectionString("DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=mykey;EndpointSuffix=core.windows.net")
.buildClient();
// Using Azure Identity (production recommended)
BlobServiceClient serviceClient = new BlobServiceClientBuilder()
.endpoint("https://myaccount.blob.core.windows.net")
.credential(new DefaultAzureCredentialBuilder().build())
.buildClient();
// Using shared key credential
StorageSharedKeyCredential credential = new StorageSharedKeyCredential("myaccount", "mykey");
BlobServiceClient serviceClient = new BlobServiceClientBuilder()
.endpoint("https://myaccount.blob.core.windows.net")
.credential(credential)
.buildClient();
// Using SAS token
BlobServiceClient serviceClient = new BlobServiceClientBuilder()
.endpoint("https://myaccount.blob.core.windows.net")
.sasToken("sv=2023-11-03&ss=b&srt=sco&sp=rwdlacupx&se=2024-01-01T00:00:00Z&st=2023-12-01T00:00:00Z&spr=https&sig=signature")
.buildClient();import com.azure.storage.blob.models.*;
import com.azure.core.http.rest.PagedIterable;
import com.azure.core.http.rest.Response;
import com.azure.core.util.Context;
// Create container
BlobContainerClient containerClient = serviceClient.createBlobContainer("mycontainer");
// Create container with options
Map<String, String> metadata = Map.of(
"environment", "production",
"team", "backend"
);
Response<BlobContainerClient> response = serviceClient.createBlobContainerWithResponse(
"mycontainer",
metadata,
PublicAccessType.BLOB,
Context.NONE
);
// Create container if not exists
BlobContainerClient containerClient = serviceClient.createBlobContainerIfNotExists("mycontainer");
// Get existing container client
BlobContainerClient containerClient = serviceClient.getBlobContainerClient("mycontainer");
// Delete container
serviceClient.deleteBlobContainer("mycontainer");
// Delete container if exists
boolean deleted = serviceClient.deleteBlobContainerIfExists("mycontainer");
// Undelete container (if soft delete is enabled)
BlobContainerClient restoredContainer = serviceClient.undeleteBlobContainer(
"mycontainer",
"01D64EAD4C6B7A00" // deletion version
);import com.azure.storage.blob.models.ListBlobContainersOptions;
import java.time.Duration;
// List all containers
PagedIterable<BlobContainerItem> containers = serviceClient.listBlobContainers();
for (BlobContainerItem container : containers) {
System.out.println("Container: " + container.getName());
System.out.println("Last Modified: " + container.getProperties().getLastModified());
System.out.println("Public Access: " + container.getProperties().getPublicAccess());
}
// List containers with filtering and options
ListBlobContainersOptions options = new ListBlobContainersOptions()
.setPrefix("test-")
.setDetails(new BlobContainerListDetails()
.setRetrieveDeleted(true)
.setRetrieveMetadata(true))
.setMaxResultsPerPage(50);
PagedIterable<BlobContainerItem> filteredContainers = serviceClient.listBlobContainers(
options,
Duration.ofSeconds(30)
);
for (BlobContainerItem container : filteredContainers) {
System.out.println("Container: " + container.getName());
System.out.println("Metadata: " + container.getMetadata());
System.out.println("Deleted: " + container.isDeleted());
}import com.azure.storage.blob.models.*;
// Get service properties
BlobServiceProperties properties = serviceClient.getProperties();
System.out.println("Default service version: " + properties.getDefaultServiceVersion());
System.out.println("Hour metrics enabled: " + properties.getHourMetrics().isEnabled());
// Configure service properties
BlobServiceProperties newProperties = new BlobServiceProperties();
// Configure logging
BlobAnalyticsLogging logging = new BlobAnalyticsLogging()
.setVersion("1.0")
.setDeleteEnabled(true)
.setReadEnabled(true)
.setWriteEnabled(true)
.setRetentionPolicy(new BlobRetentionPolicy()
.setEnabled(true)
.setDays(30));
newProperties.setLogging(logging);
// Configure metrics
BlobMetrics hourMetrics = new BlobMetrics()
.setVersion("1.0")
.setEnabled(true)
.setIncludeApis(true)
.setRetentionPolicy(new BlobRetentionPolicy()
.setEnabled(true)
.setDays(7));
newProperties.setHourMetrics(hourMetrics);
// Configure CORS
List<BlobCorsRule> corsRules = List.of(
new BlobCorsRule()
.setAllowedOrigins("https://example.com")
.setAllowedMethods("GET,PUT,POST")
.setAllowedHeaders("x-ms-*,content-type")
.setExposedHeaders("x-ms-*")
.setMaxAgeInSeconds(3600)
);
newProperties.setCors(corsRules);
// Configure static website
BlobStaticWebsite staticWebsite = new BlobStaticWebsite()
.setEnabled(true)
.setIndexDocument("index.html")
.setErrorDocument404Path("error.html");
newProperties.setStaticWebsite(staticWebsite);
// Apply properties
serviceClient.setProperties(newProperties);// Get account information
StorageAccountInfo accountInfo = serviceClient.getAccountInfo();
System.out.println("Account kind: " + accountInfo.getAccountKind());
System.out.println("SKU name: " + accountInfo.getSkuName());
System.out.println("Hierarchical namespace: " + accountInfo.isHierarchicalNamespaceEnabled());
// Get service statistics (geo-replication info)
BlobServiceStatistics stats = serviceClient.getStatistics();
if (stats.getGeoReplication() != null) {
System.out.println("Geo-replication status: " + stats.getGeoReplication().getStatus());
System.out.println("Last sync time: " + stats.getGeoReplication().getLastSyncTime());
}// Find blobs across all containers using tag queries
String tagQuery = "environment='production' AND team='backend'";
PagedIterable<TaggedBlobItem> taggedBlobs = serviceClient.findBlobsByTags(tagQuery);
for (TaggedBlobItem taggedBlob : taggedBlobs) {
System.out.println("Blob: " + taggedBlob.getName());
System.out.println("Container: " + taggedBlob.getContainerName());
System.out.println("Tags: " + taggedBlob.getTags().toMap());
}
// Find with pagination
FindBlobsOptions findOptions = new FindBlobsOptions(tagQuery)
.setMaxResultsPerPage(100);
PagedIterable<TaggedBlobItem> pagedResults = serviceClient.findBlobsByTags(findOptions, Duration.ofMinutes(1));import java.time.OffsetDateTime;
// Get user delegation key for SAS generation (Azure AD authentication only)
OffsetDateTime keyStart = OffsetDateTime.now();
OffsetDateTime keyExpiry = keyStart.plusDays(7);
try {
UserDelegationKey userDelegationKey = serviceClient.getUserDelegationKey(keyStart, keyExpiry);
System.out.println("Delegation key acquired");
System.out.println("Signed object ID: " + userDelegationKey.getSignedObjectId());
System.out.println("Valid until: " + userDelegationKey.getSignedExpiry());
// Use the key to generate SAS tokens
// (See security documentation for SAS generation details)
} catch (Exception ex) {
System.err.println("Failed to get user delegation key: " + ex.getMessage());
}import com.azure.storage.common.sas.*;
import java.time.OffsetDateTime;
// Generate account-level SAS token
OffsetDateTime expiryTime = OffsetDateTime.now().plusHours(24);
AccountSasSignatureValues accountSasValues = new AccountSasSignatureValues(
expiryTime,
AccountSasPermission.parse("rwdlacup"), // permissions
AccountSasService.parse("b"), // blob service
AccountSasResourceType.parse("sco") // service, container, object
)
.setStartTime(OffsetDateTime.now())
.setProtocol(SasProtocol.HTTPS_ONLY)
.setSasIpRange(SasIpRange.parse("168.1.5.60-168.1.5.70"));
String accountSas = serviceClient.generateAccountSas(accountSasValues);
System.out.println("Account SAS: " + accountSas);The asynchronous client for Azure Blob Storage service operations using reactive programming.
import com.azure.storage.blob.BlobServiceAsyncClient;
import reactor.core.publisher.Mono;
import reactor.core.publisher.Flux;
// Create async client
BlobServiceAsyncClient asyncServiceClient = new BlobServiceClientBuilder()
.connectionString("DefaultEndpointsProtocol=https;AccountName=myaccount;...")
.buildAsyncClient();
// All operations return Mono<T> or Flux<T>// Create container asynchronously
Mono<BlobContainerAsyncClient> containerMono = asyncServiceClient.createBlobContainer("mycontainer");
// Chain operations
containerMono
.flatMap(container -> container.create())
.doOnSuccess(response -> System.out.println("Container created"))
.doOnError(error -> System.err.println("Creation failed: " + error.getMessage()))
.subscribe();
// List containers asynchronously
Flux<BlobContainerItem> containerFlux = asyncServiceClient.listBlobContainers();
containerFlux
.take(10) // Limit to first 10 containers
.doOnNext(container -> System.out.println("Container: " + container.getName()))
.doOnComplete(() -> System.out.println("Listing complete"))
.subscribe();// Get properties asynchronously
Mono<BlobServiceProperties> propertiesMono = asyncServiceClient.getProperties();
propertiesMono
.doOnNext(props -> {
System.out.println("Default version: " + props.getDefaultServiceVersion());
System.out.println("Static website enabled: " +
(props.getStaticWebsite() != null && props.getStaticWebsite().isEnabled()));
})
.subscribe();
// Update properties
BlobServiceProperties newProps = new BlobServiceProperties()
.setDefaultServiceVersion("2023-11-03");
Mono<Void> updateMono = asyncServiceClient.setProperties(newProps);
updateMono
.doOnSuccess(v -> System.out.println("Properties updated"))
.doOnError(ex -> System.err.println("Update failed: " + ex.getMessage()))
.subscribe();import com.azure.storage.blob.models.BlobStorageException;
// Handle errors in reactive chains
asyncServiceClient.createBlobContainer("invalid/container/name")
.doOnSuccess(container -> System.out.println("Container created"))
.onErrorResume(BlobStorageException.class, ex -> {
System.err.println("Storage error: " + ex.getErrorCode());
System.err.println("Status: " + ex.getStatusCode());
return Mono.empty(); // Continue with empty result
})
.onErrorResume(Exception.class, ex -> {
System.err.println("General error: " + ex.getMessage());
return Mono.error(ex); // Re-throw other exceptions
})
.subscribe();
// Blocking operations (use sparingly)
try {
BlobContainerAsyncClient container = asyncServiceClient
.createBlobContainer("mycontainer")
.block(Duration.ofSeconds(30));
System.out.println("Container created: " + container.getBlobContainerName());
} catch (Exception ex) {
System.err.println("Operation failed: " + ex.getMessage());
}import com.azure.core.http.HttpClient;
import com.azure.core.http.netty.NettyAsyncHttpClientBuilder;
import com.azure.core.http.policy.*;
import java.time.Duration;
// Configure HTTP client
HttpClient httpClient = new NettyAsyncHttpClientBuilder()
.connectionTimeout(Duration.ofSeconds(60))
.responseTimeout(Duration.ofSeconds(120))
.maxIdleTime(Duration.ofSeconds(60))
.build();
// Configure retry policy
RetryPolicy retryPolicy = new RetryPolicy("fixed", 3);
// Build service client with custom configuration
BlobServiceClient serviceClient = new BlobServiceClientBuilder()
.endpoint("https://myaccount.blob.core.windows.net")
.credential(new DefaultAzureCredentialBuilder().build())
.httpClient(httpClient)
.retryPolicy(retryPolicy)
.addPolicy(new UserAgentPolicy("MyApp/1.0"))
.serviceVersion(BlobServiceVersion.V2023_11_03)
.buildClient();import com.azure.storage.blob.models.CustomerProvidedKey;
import com.azure.storage.blob.models.EncryptionAlgorithmType;
// Configure customer-provided encryption key
CustomerProvidedKey cpk = new CustomerProvidedKey("myEncryptionKey")
.setEncryptionAlgorithm(EncryptionAlgorithmType.AES256);
BlobServiceClient serviceClient = new BlobServiceClientBuilder()
.connectionString("DefaultEndpointsProtocol=https;AccountName=myaccount;...")
.customerProvidedKey(cpk)
.buildClient();
// All operations will use the provided encryption key// Configure encryption scope
BlobServiceClient serviceClient = new BlobServiceClientBuilder()
.connectionString("DefaultEndpointsProtocol=https;AccountName=myaccount;...")
.encryptionScope("myencryptionscope")
.buildClient();
// All blobs created through this client will use the encryption scope// Get service client properties
String accountUrl = serviceClient.getAccountUrl();
String accountName = serviceClient.getAccountName();
BlobServiceVersion serviceVersion = serviceClient.getServiceVersion();
System.out.println("Account URL: " + accountUrl);
System.out.println("Account Name: " + accountName);
System.out.println("Service Version: " + serviceVersion.getVersion());
// Access HTTP pipeline for advanced scenarios
HttpPipeline pipeline = serviceClient.getHttpPipeline();// Important service-level constants
public static final String ROOT_CONTAINER_NAME = "$root";
public static final String STATIC_WEBSITE_CONTAINER_NAME = "$web";
public static final String LOG_CONTAINER_NAME = "$logs";
// Use these for special containers
BlobContainerClient rootContainer = serviceClient.getBlobContainerClient(BlobContainerClient.ROOT_CONTAINER_NAME);
BlobContainerClient webContainer = serviceClient.getBlobContainerClient(BlobContainerClient.STATIC_WEBSITE_CONTAINER_NAME);Install with Tessl CLI
npx tessl i tessl/maven-com-azure--azure-storage-blob