--- name: azure-storage-blob-java description: "Build blob storage applications with Azure Storage Blob SDK for Java. Use when uploading, downloading, or managing files in Azure Blob Storage, working with containers, or implementing streaming da..." risk: unknown source: community date_added: "2026-02-27" --- # Azure Storage Blob SDK for Java Build blob storage applications using the Azure Storage Blob SDK for Java. ## Installation ```xml com.azure azure-storage-blob 12.33.0 ``` ## Client Creation ### BlobServiceClient ```java import com.azure.storage.blob.BlobServiceClient; import com.azure.storage.blob.BlobServiceClientBuilder; // With SAS token BlobServiceClient serviceClient = new BlobServiceClientBuilder() .endpoint("") .sasToken("") .buildClient(); // With connection string BlobServiceClient serviceClient = new BlobServiceClientBuilder() .connectionString("") .buildClient(); ``` ### With DefaultAzureCredential ```java import com.azure.identity.DefaultAzureCredentialBuilder; BlobServiceClient serviceClient = new BlobServiceClientBuilder() .endpoint("") .credential(new DefaultAzureCredentialBuilder().build()) .buildClient(); ``` ### BlobContainerClient ```java import com.azure.storage.blob.BlobContainerClient; // From service client BlobContainerClient containerClient = serviceClient.getBlobContainerClient("mycontainer"); // Direct construction BlobContainerClient containerClient = new BlobContainerClientBuilder() .connectionString("") .containerName("mycontainer") .buildClient(); ``` ### BlobClient ```java import com.azure.storage.blob.BlobClient; // From container client BlobClient blobClient = containerClient.getBlobClient("myblob.txt"); // With directory structure BlobClient blobClient = containerClient.getBlobClient("folder/subfolder/myblob.txt"); // Direct construction BlobClient blobClient = new BlobClientBuilder() .connectionString("") .containerName("mycontainer") .blobName("myblob.txt") .buildClient(); ``` ## Core Patterns ### Create Container ```java // Create container serviceClient.createBlobContainer("mycontainer"); // Create if not exists BlobContainerClient container = serviceClient.createBlobContainerIfNotExists("mycontainer"); // From container client containerClient.create(); containerClient.createIfNotExists(); ``` ### Upload Data ```java import com.azure.core.util.BinaryData; // Upload string String data = "Hello, Azure Blob Storage!"; blobClient.upload(BinaryData.fromString(data)); // Upload with overwrite blobClient.upload(BinaryData.fromString(data), true); ``` ### Upload from File ```java blobClient.uploadFromFile("local-file.txt"); // With overwrite blobClient.uploadFromFile("local-file.txt", true); ``` ### Upload from Stream ```java import com.azure.storage.blob.specialized.BlockBlobClient; BlockBlobClient blockBlobClient = blobClient.getBlockBlobClient(); try (ByteArrayInputStream dataStream = new ByteArrayInputStream(data.getBytes())) { blockBlobClient.upload(dataStream, data.length()); } ``` ### Upload with Options ```java import com.azure.storage.blob.models.BlobHttpHeaders; import com.azure.storage.blob.options.BlobParallelUploadOptions; BlobHttpHeaders headers = new BlobHttpHeaders() .setContentType("text/plain") .setCacheControl("max-age=3600"); Map metadata = Map.of("author", "john", "version", "1.0"); try (InputStream stream = new FileInputStream("large-file.bin")) { BlobParallelUploadOptions options = new BlobParallelUploadOptions(stream) .setHeaders(headers) .setMetadata(metadata); blobClient.uploadWithResponse(options, null, Context.NONE); } ``` ### Upload if Not Exists ```java import com.azure.storage.blob.models.BlobRequestConditions; BlobParallelUploadOptions options = new BlobParallelUploadOptions(inputStream, length) .setRequestConditions(new BlobRequestConditions().setIfNoneMatch("*")); blobClient.uploadWithResponse(options, null, Context.NONE); ``` ### Download Data ```java // Download to BinaryData BinaryData content = blobClient.downloadContent(); String text = content.toString(); // Download to file blobClient.downloadToFile("downloaded-file.txt"); ``` ### Download to Stream ```java try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { blobClient.downloadStream(outputStream); byte[] data = outputStream.toByteArray(); } ``` ### Download with InputStream ```java import com.azure.storage.blob.specialized.BlobInputStream; try (BlobInputStream blobIS = blobClient.openInputStream()) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = blobIS.read(buffer)) != -1) { // Process buffer } } ``` ### Upload via OutputStream ```java import com.azure.storage.blob.specialized.BlobOutputStream; try (BlobOutputStream blobOS = blobClient.getBlockBlobClient().getBlobOutputStream()) { blobOS.write("Data to upload".getBytes()); } ``` ### List Blobs ```java import com.azure.storage.blob.models.BlobItem; // List all blobs for (BlobItem blobItem : containerClient.listBlobs()) { System.out.println("Blob: " + blobItem.getName()); } // List with prefix (virtual directory) import com.azure.storage.blob.models.ListBlobsOptions; ListBlobsOptions options = new ListBlobsOptions().setPrefix("folder/"); for (BlobItem blobItem : containerClient.listBlobs(options, null)) { System.out.println("Blob: " + blobItem.getName()); } ``` ### List Blobs by Hierarchy ```java import com.azure.storage.blob.models.BlobListDetails; String delimiter = "/"; ListBlobsOptions options = new ListBlobsOptions() .setPrefix("data/") .setDetails(new BlobListDetails().setRetrieveMetadata(true)); for (BlobItem item : containerClient.listBlobsByHierarchy(delimiter, options, null)) { if (item.isPrefix()) { System.out.println("Directory: " + item.getName()); } else { System.out.println("Blob: " + item.getName()); } } ``` ### Delete Blob ```java blobClient.delete(); // Delete if exists blobClient.deleteIfExists(); // Delete with snapshots import com.azure.storage.blob.models.DeleteSnapshotsOptionType; blobClient.deleteWithResponse(DeleteSnapshotsOptionType.INCLUDE, null, null, Context.NONE); ``` ### Copy Blob ```java import com.azure.storage.blob.models.BlobCopyInfo; import com.azure.core.util.polling.SyncPoller; // Async copy (for large blobs or cross-account) SyncPoller poller = blobClient.beginCopy("", Duration.ofSeconds(1)); poller.waitForCompletion(); // Sync copy from URL (for same account) blobClient.copyFromUrl(""); ``` ### Generate SAS Token ```java import com.azure.storage.blob.sas.*; import java.time.OffsetDateTime; // Blob-level SAS BlobSasPermission permissions = new BlobSasPermission().setReadPermission(true); OffsetDateTime expiry = OffsetDateTime.now().plusDays(1); BlobServiceSasSignatureValues sasValues = new BlobServiceSasSignatureValues(expiry, permissions); String sasToken = blobClient.generateSas(sasValues); // Container-level SAS BlobContainerSasPermission containerPermissions = new BlobContainerSasPermission() .setReadPermission(true) .setListPermission(true); BlobServiceSasSignatureValues containerSasValues = new BlobServiceSasSignatureValues(expiry, containerPermissions); String containerSas = containerClient.generateSas(containerSasValues); ``` ### Blob Properties and Metadata ```java import com.azure.storage.blob.models.BlobProperties; // Get properties BlobProperties properties = blobClient.getProperties(); System.out.println("Size: " + properties.getBlobSize()); System.out.println("Content-Type: " + properties.getContentType()); System.out.println("Last Modified: " + properties.getLastModified()); // Set metadata Map metadata = Map.of("key1", "value1", "key2", "value2"); blobClient.setMetadata(metadata); // Set HTTP headers BlobHttpHeaders headers = new BlobHttpHeaders() .setContentType("application/json") .setCacheControl("max-age=86400"); blobClient.setHttpHeaders(headers); ``` ### Lease Blob ```java import com.azure.storage.blob.specialized.BlobLeaseClient; import com.azure.storage.blob.specialized.BlobLeaseClientBuilder; BlobLeaseClient leaseClient = new BlobLeaseClientBuilder() .blobClient(blobClient) .buildClient(); // Acquire lease (-1 for infinite) String leaseId = leaseClient.acquireLease(60); // Renew lease leaseClient.renewLease(); // Release lease leaseClient.releaseLease(); ``` ## Error Handling ```java import com.azure.storage.blob.models.BlobStorageException; try { blobClient.download(outputStream); } catch (BlobStorageException e) { System.out.println("Status: " + e.getStatusCode()); System.out.println("Error code: " + e.getErrorCode()); // 404 = Blob not found // 409 = Conflict (lease, etc.) } ``` ## Proxy Configuration ```java import com.azure.core.http.ProxyOptions; import com.azure.core.http.netty.NettyAsyncHttpClientBuilder; import java.net.InetSocketAddress; ProxyOptions proxyOptions = new ProxyOptions( ProxyOptions.Type.HTTP, new InetSocketAddress("localhost", 8888)); BlobServiceClient client = new BlobServiceClientBuilder() .endpoint("") .sasToken("") .httpClient(new NettyAsyncHttpClientBuilder().proxy(proxyOptions).build()) .buildClient(); ``` ## Environment Variables ```bash AZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=... AZURE_STORAGE_ACCOUNT_URL=https://.blob.core.windows.net ``` ## Trigger Phrases - "Azure Blob Storage Java" - "upload download blob" - "blob container SDK" - "storage streaming" - "SAS token generation" - "blob metadata properties" ## When to Use This skill is applicable to execute the workflow or actions described in the overview.