[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M73ER4AAQA2TYFG3FHNYJSAM":3,"skill-same:01M73ER4AAQA2TYFG3FHNYJSAM":56},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":28,"commitSha":29,"skillDirectory":30,"forksCount":31,"repositoryHtmlUrl":32,"repositoryHomepageUrl":6,"ownerHtmlUrl":33,"ownerBlogUrl":34,"ownerDescription":6,"updatedAt":35,"install":36,"resources":49},"01M73ER4AAQA2TYFG3FHNYJSAM","azure-storage-blob-java",null,"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 data operations.","qhjqhj00\u002Fresearch-skills-pool","qhjqhj00","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F29684092?v=4","01M72AE0ZGXVM5C57N512DGQG8","Tommy Chien","01M72AE107ESJMHT7QC5SXX144",3,"MIT","https:\u002F\u002Fgithub.com\u002Fqhjqhj00\u002Fresearch-skills-pool\u002Fblob\u002Fmaster\u002Fskills_collected\u002Fmicrosoft--skills--.github__plugins__azure-sdk-java__skills__azure-storage-blob-java\u002FSKILL.md",[],[],"2026-11-11 15:11:14",false,"---\nname: azure-storage-blob-java\ndescription: 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 data operations.\nlicense: MIT\nmetadata:\n  author: Microsoft\n  version: \"1.0.0\"\n  package: com.azure:azure-storage-blob\n---\n\n# Azure Storage Blob SDK for Java\n\nBuild blob storage applications using the Azure Storage Blob SDK for Java.\n\n## Installation\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>com.azure\u003C\u002FgroupId>\n    \u003CartifactId>azure-storage-blob\u003C\u002FartifactId>\n    \u003Cversion>12.33.0\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\n## Client Creation\n\n### BlobServiceClient\n\n```java\nimport com.azure.storage.blob.BlobServiceClient;\nimport com.azure.storage.blob.BlobServiceClientBuilder;\n\n\u002F\u002F With SAS token\nBlobServiceClient serviceClient = new BlobServiceClientBuilder()\n    .endpoint(\"\u003Cstorage-account-url>\")\n    .sasToken(\"\u003Csas-token>\")\n    .buildClient();\n\n\u002F\u002F With connection string\nBlobServiceClient serviceClient = new BlobServiceClientBuilder()\n    .connectionString(\"\u003Cconnection-string>\")\n    .buildClient();\n```\n\n### With DefaultAzureCredential\n\n```java\nimport com.azure.core.credential.TokenCredential;\nimport com.azure.identity.AzureIdentityEnvVars;\nimport com.azure.identity.DefaultAzureCredentialBuilder;\nimport com.azure.identity.ManagedIdentityCredentialBuilder;\n\n\u002F\u002F Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=\u003Cspecific_credential>\nTokenCredential credential = new DefaultAzureCredentialBuilder()\n    .requireEnvVars(AzureIdentityEnvVars.AZURE_TOKEN_CREDENTIALS)\n    .build();\n\u002F\u002F Or use a specific credential directly in production:\n\u002F\u002F See https:\u002F\u002Flearn.microsoft.com\u002Fjava\u002Fapi\u002Foverview\u002Fazure\u002Fidentity-readme?view=azure-java-stable#credential-classes\n\u002F\u002F TokenCredential credential = new ManagedIdentityCredentialBuilder().build();\n\nBlobServiceClient serviceClient = new BlobServiceClientBuilder()\n    .endpoint(\"\u003Cstorage-account-url>\")\n    .credential(credential)\n    .buildClient();\n```\n\n### BlobContainerClient\n\n```java\nimport com.azure.storage.blob.BlobContainerClient;\n\n\u002F\u002F From service client\nBlobContainerClient containerClient = serviceClient.getBlobContainerClient(\"mycontainer\");\n\n\u002F\u002F Direct construction\nBlobContainerClient containerClient = new BlobContainerClientBuilder()\n    .connectionString(\"\u003Cconnection-string>\")\n    .containerName(\"mycontainer\")\n    .buildClient();\n```\n\n### BlobClient\n\n```java\nimport com.azure.storage.blob.BlobClient;\n\n\u002F\u002F From container client\nBlobClient blobClient = containerClient.getBlobClient(\"myblob.txt\");\n\n\u002F\u002F With directory structure\nBlobClient blobClient = containerClient.getBlobClient(\"folder\u002Fsubfolder\u002Fmyblob.txt\");\n\n\u002F\u002F Direct construction\nBlobClient blobClient = new BlobClientBuilder()\n    .connectionString(\"\u003Cconnection-string>\")\n    .containerName(\"mycontainer\")\n    .blobName(\"myblob.txt\")\n    .buildClient();\n```\n\n## Core Patterns\n\n### Create Container\n\n```java\n\u002F\u002F Create container\nserviceClient.createBlobContainer(\"mycontainer\");\n\n\u002F\u002F Create if not exists\nBlobContainerClient container = serviceClient.createBlobContainerIfNotExists(\"mycontainer\");\n\n\u002F\u002F From container client\ncontainerClient.create();\ncontainerClient.createIfNotExists();\n```\n\n### Upload Data\n\n```java\nimport com.azure.core.util.BinaryData;\n\n\u002F\u002F Upload string\nString data = \"Hello, Azure Blob Storage!\";\nblobClient.upload(BinaryData.fromString(data));\n\n\u002F\u002F Upload with overwrite\nblobClient.upload(BinaryData.fromString(data), true);\n```\n\n### Upload from File\n\n```java\nblobClient.uploadFromFile(\"local-file.txt\");\n\n\u002F\u002F With overwrite\nblobClient.uploadFromFile(\"local-file.txt\", true);\n```\n\n### Upload from Stream\n\n```java\nimport com.azure.storage.blob.specialized.BlockBlobClient;\n\nBlockBlobClient blockBlobClient = blobClient.getBlockBlobClient();\n\ntry (ByteArrayInputStream dataStream = new ByteArrayInputStream(data.getBytes())) {\n    blockBlobClient.upload(dataStream, data.length());\n}\n```\n\n### Upload with Options\n\n```java\nimport com.azure.storage.blob.models.BlobHttpHeaders;\nimport com.azure.storage.blob.options.BlobParallelUploadOptions;\n\nBlobHttpHeaders headers = new BlobHttpHeaders()\n    .setContentType(\"text\u002Fplain\")\n    .setCacheControl(\"max-age=3600\");\n\nMap\u003CString, String> metadata = Map.of(\"author\", \"john\", \"version\", \"1.0\");\n\ntry (InputStream stream = new FileInputStream(\"large-file.bin\")) {\n    BlobParallelUploadOptions options = new BlobParallelUploadOptions(stream)\n        .setHeaders(headers)\n        .setMetadata(metadata);\n    \n    blobClient.uploadWithResponse(options, null, Context.NONE);\n}\n```\n\n### Upload if Not Exists\n\n```java\nimport com.azure.storage.blob.models.BlobRequestConditions;\n\nBlobParallelUploadOptions options = new BlobParallelUploadOptions(inputStream, length)\n    .setRequestConditions(new BlobRequestConditions().setIfNoneMatch(\"*\"));\n\nblobClient.uploadWithResponse(options, null, Context.NONE);\n```\n\n### Download Data\n\n```java\n\u002F\u002F Download to BinaryData\nBinaryData content = blobClient.downloadContent();\nString text = content.toString();\n\n\u002F\u002F Download to file\nblobClient.downloadToFile(\"downloaded-file.txt\");\n```\n\n### Download to Stream\n\n```java\ntry (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {\n    blobClient.downloadStream(outputStream);\n    byte[] data = outputStream.toByteArray();\n}\n```\n\n### Download with InputStream\n\n```java\nimport com.azure.storage.blob.specialized.BlobInputStream;\n\ntry (BlobInputStream blobIS = blobClient.openInputStream()) {\n    byte[] buffer = new byte[1024];\n    int bytesRead;\n    while ((bytesRead = blobIS.read(buffer)) != -1) {\n        \u002F\u002F Process buffer\n    }\n}\n```\n\n### Upload via OutputStream\n\n```java\nimport com.azure.storage.blob.specialized.BlobOutputStream;\n\ntry (BlobOutputStream blobOS = blobClient.getBlockBlobClient().getBlobOutputStream()) {\n    blobOS.write(\"Data to upload\".getBytes());\n}\n```\n\n### List Blobs\n\n```java\nimport com.azure.storage.blob.models.BlobItem;\n\n\u002F\u002F List all blobs\nfor (BlobItem blobItem : containerClient.listBlobs()) {\n    System.out.println(\"Blob: \" + blobItem.getName());\n}\n\n\u002F\u002F List with prefix (virtual directory)\nimport com.azure.storage.blob.models.ListBlobsOptions;\n\nListBlobsOptions options = new ListBlobsOptions().setPrefix(\"folder\u002F\");\nfor (BlobItem blobItem : containerClient.listBlobs(options, null)) {\n    System.out.println(\"Blob: \" + blobItem.getName());\n}\n```\n\n### List Blobs by Hierarchy\n\n```java\nimport com.azure.storage.blob.models.BlobListDetails;\n\nString delimiter = \"\u002F\";\nListBlobsOptions options = new ListBlobsOptions()\n    .setPrefix(\"data\u002F\")\n    .setDetails(new BlobListDetails().setRetrieveMetadata(true));\n\nfor (BlobItem item : containerClient.listBlobsByHierarchy(delimiter, options, null)) {\n    if (item.isPrefix()) {\n        System.out.println(\"Directory: \" + item.getName());\n    } else {\n        System.out.println(\"Blob: \" + item.getName());\n    }\n}\n```\n\n### Delete Blob\n\n```java\nblobClient.delete();\n\n\u002F\u002F Delete if exists\nblobClient.deleteIfExists();\n\n\u002F\u002F Delete with snapshots\nimport com.azure.storage.blob.models.DeleteSnapshotsOptionType;\nblobClient.deleteWithResponse(DeleteSnapshotsOptionType.INCLUDE, null, null, Context.NONE);\n```\n\n### Copy Blob\n\n```java\nimport com.azure.storage.blob.models.BlobCopyInfo;\nimport com.azure.core.util.polling.SyncPoller;\n\n\u002F\u002F Async copy (for large blobs or cross-account)\nSyncPoller\u003CBlobCopyInfo, Void> poller = blobClient.beginCopy(\"\u003Csource-blob-url>\", Duration.ofSeconds(1));\npoller.waitForCompletion();\n\n\u002F\u002F Sync copy from URL (for same account)\nblobClient.copyFromUrl(\"\u003Csource-blob-url>\");\n```\n\n### Generate SAS Token\n\n```java\nimport com.azure.storage.blob.sas.*;\nimport java.time.OffsetDateTime;\n\n\u002F\u002F Blob-level SAS\nBlobSasPermission permissions = new BlobSasPermission().setReadPermission(true);\nOffsetDateTime expiry = OffsetDateTime.now().plusDays(1);\n\nBlobServiceSasSignatureValues sasValues = new BlobServiceSasSignatureValues(expiry, permissions);\nString sasToken = blobClient.generateSas(sasValues);\n\n\u002F\u002F Container-level SAS\nBlobContainerSasPermission containerPermissions = new BlobContainerSasPermission()\n    .setReadPermission(true)\n    .setListPermission(true);\n    \nBlobServiceSasSignatureValues containerSasValues = new BlobServiceSasSignatureValues(expiry, containerPermissions);\nString containerSas = containerClient.generateSas(containerSasValues);\n```\n\n### Blob Properties and Metadata\n\n```java\nimport com.azure.storage.blob.models.BlobProperties;\n\n\u002F\u002F Get properties\nBlobProperties properties = blobClient.getProperties();\nSystem.out.println(\"Size: \" + properties.getBlobSize());\nSystem.out.println(\"Content-Type: \" + properties.getContentType());\nSystem.out.println(\"Last Modified: \" + properties.getLastModified());\n\n\u002F\u002F Set metadata\nMap\u003CString, String> metadata = Map.of(\"key1\", \"value1\", \"key2\", \"value2\");\nblobClient.setMetadata(metadata);\n\n\u002F\u002F Set HTTP headers\nBlobHttpHeaders headers = new BlobHttpHeaders()\n    .setContentType(\"application\u002Fjson\")\n    .setCacheControl(\"max-age=86400\");\nblobClient.setHttpHeaders(headers);\n```\n\n### Lease Blob\n\n```java\nimport com.azure.storage.blob.specialized.BlobLeaseClient;\nimport com.azure.storage.blob.specialized.BlobLeaseClientBuilder;\n\nBlobLeaseClient leaseClient = new BlobLeaseClientBuilder()\n    .blobClient(blobClient)\n    .buildClient();\n\n\u002F\u002F Acquire lease (-1 for infinite)\nString leaseId = leaseClient.acquireLease(60);\n\n\u002F\u002F Renew lease\nleaseClient.renewLease();\n\n\u002F\u002F Release lease\nleaseClient.releaseLease();\n```\n\n## Error Handling\n\n```java\nimport com.azure.storage.blob.models.BlobStorageException;\n\ntry {\n    blobClient.download(outputStream);\n} catch (BlobStorageException e) {\n    System.out.println(\"Status: \" + e.getStatusCode());\n    System.out.println(\"Error code: \" + e.getErrorCode());\n    \u002F\u002F 404 = Blob not found\n    \u002F\u002F 409 = Conflict (lease, etc.)\n}\n```\n\n## Proxy Configuration\n\n```java\nimport com.azure.core.http.ProxyOptions;\nimport com.azure.core.http.netty.NettyAsyncHttpClientBuilder;\nimport java.net.InetSocketAddress;\n\nProxyOptions proxyOptions = new ProxyOptions(\n    ProxyOptions.Type.HTTP,\n    new InetSocketAddress(\"localhost\", 8888));\n\nBlobServiceClient client = new BlobServiceClientBuilder()\n    .endpoint(\"\u003Cendpoint>\")\n    .sasToken(\"\u003Csas-token>\")\n    .httpClient(new NettyAsyncHttpClientBuilder().proxy(proxyOptions).build())\n    .buildClient();\n```\n\n## Environment Variables\n\n```bash\nAZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=...  # Alternative to Entra ID auth\nAZURE_STORAGE_ACCOUNT_URL=https:\u002F\u002F\u003Caccount>.blob.core.windows.net  # Required for all auth methods\nAZURE_TOKEN_CREDENTIALS=prod  # Required only if DefaultAzureCredential is used in production\n```\n\n## Trigger Phrases\n\n- \"Azure Blob Storage Java\"\n- \"upload download blob\"\n- \"blob container SDK\"\n- \"storage streaming\"\n- \"SAS token generation\"\n- \"blob metadata properties\"\n","# Azure Storage Blob SDK for Java\n\nBuild blob storage applications using the Azure Storage Blob SDK for Java.\n\n## Installation\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>com.azure\u003C\u002FgroupId>\n    \u003CartifactId>azure-storage-blob\u003C\u002FartifactId>\n    \u003Cversion>12.33.0\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\n## Client Creation\n\n### BlobServiceClient\n\n```java\nimport com.azure.storage.blob.BlobServiceClient;\nimport com.azure.storage.blob.BlobServiceClientBuilder;\n\n\u002F\u002F With SAS token\nBlobServiceClient serviceClient = new BlobServiceClientBuilder()\n    .endpoint(\"\u003Cstorage-account-url>\")\n    .sasToken(\"\u003Csas-token>\")\n    .buildClient();\n\n\u002F\u002F With connection string\nBlobServiceClient serviceClient = new BlobServiceClientBuilder()\n    .connectionString(\"\u003Cconnection-string>\")\n    .buildClient();\n```\n\n### With DefaultAzureCredential\n\n```java\nimport com.azure.core.credential.TokenCredential;\nimport com.azure.identity.AzureIdentityEnvVars;\nimport com.azure.identity.DefaultAzureCredentialBuilder;\nimport com.azure.identity.ManagedIdentityCredentialBuilder;\n\n\u002F\u002F Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=\u003Cspecific_credential>\nTokenCredential credential = new DefaultAzureCredentialBuilder()\n    .requireEnvVars(AzureIdentityEnvVars.AZURE_TOKEN_CREDENTIALS)\n    .build();\n\u002F\u002F Or use a specific credential directly in production:\n\u002F\u002F See https:\u002F\u002Flearn.microsoft.com\u002Fjava\u002Fapi\u002Foverview\u002Fazure\u002Fidentity-readme?view=azure-java-stable#credential-classes\n\u002F\u002F TokenCredential credential = new ManagedIdentityCredentialBuilder().build();\n\nBlobServiceClient serviceClient = new BlobServiceClientBuilder()\n    .endpoint(\"\u003Cstorage-account-url>\")\n    .credential(credential)\n    .buildClient();\n```\n\n### BlobContainerClient\n\n```java\nimport com.azure.storage.blob.BlobContainerClient;\n\n\u002F\u002F From service client\nBlobContainerClient containerClient = serviceClient.getBlobContainerClient(\"mycontainer\");\n\n\u002F\u002F Direct construction\nBlobContainerClient containerClient = new BlobContainerClientBuilder()\n    .connectionString(\"\u003Cconnection-string>\")\n    .containerName(\"mycontainer\")\n    .buildClient();\n```\n\n### BlobClient\n\n```java\nimport com.azure.storage.blob.BlobClient;\n\n\u002F\u002F From container client\nBlobClient blobClient = containerClient.getBlobClient(\"myblob.txt\");\n\n\u002F\u002F With directory structure\nBlobClient blobClient = containerClient.getBlobClient(\"folder\u002Fsubfolder\u002Fmyblob.txt\");\n\n\u002F\u002F Direct construction\nBlobClient blobClient = new BlobClientBuilder()\n    .connectionString(\"\u003Cconnection-string>\")\n    .containerName(\"mycontainer\")\n    .blobName(\"myblob.txt\")\n    .buildClient();\n```\n\n## Core Patterns\n\n### Create Container\n\n```java\n\u002F\u002F Create container\nserviceClient.createBlobContainer(\"mycontainer\");\n\n\u002F\u002F Create if not exists\nBlobContainerClient container = serviceClient.createBlobContainerIfNotExists(\"mycontainer\");\n\n\u002F\u002F From container client\ncontainerClient.create();\ncontainerClient.createIfNotExists();\n```\n\n### Upload Data\n\n```java\nimport com.azure.core.util.BinaryData;\n\n\u002F\u002F Upload string\nString data = \"Hello, Azure Blob Storage!\";\nblobClient.upload(BinaryData.fromString(data));\n\n\u002F\u002F Upload with overwrite\nblobClient.upload(BinaryData.fromString(data), true);\n```\n\n### Upload from File\n\n```java\nblobClient.uploadFromFile(\"local-file.txt\");\n\n\u002F\u002F With overwrite\nblobClient.uploadFromFile(\"local-file.txt\", true);\n```\n\n### Upload from Stream\n\n```java\nimport com.azure.storage.blob.specialized.BlockBlobClient;\n\nBlockBlobClient blockBlobClient = blobClient.getBlockBlobClient();\n\ntry (ByteArrayInputStream dataStream = new ByteArrayInputStream(data.getBytes())) {\n    blockBlobClient.upload(dataStream, data.length());\n}\n```\n\n### Upload with Options\n\n```java\nimport com.azure.storage.blob.models.BlobHttpHeaders;\nimport com.azure.storage.blob.options.BlobParallelUploadOptions;\n\nBlobHttpHeaders headers = new BlobHttpHeaders()\n    .setContentType(\"text\u002Fplain\")\n    .setCacheControl(\"max-age=3600\");\n\nMap\u003CString, String> metadata = Map.of(\"author\", \"john\", \"version\", \"1.0\");\n\ntry (InputStream stream = new FileInputStream(\"large-file.bin\")) {\n    BlobParallelUploadOptions options = new BlobParallelUploadOptions(stream)\n        .setHeaders(headers)\n        .setMetadata(metadata);\n    \n    blobClient.uploadWithResponse(options, null, Context.NONE);\n}\n```\n\n### Upload if Not Exists\n\n```java\nimport com.azure.storage.blob.models.BlobRequestConditions;\n\nBlobParallelUploadOptions options = new BlobParallelUploadOptions(inputStream, length)\n    .setRequestConditions(new BlobRequestConditions().setIfNoneMatch(\"*\"));\n\nblobClient.uploadWithResponse(options, null, Context.NONE);\n```\n\n### Download Data\n\n```java\n\u002F\u002F Download to BinaryData\nBinaryData content = blobClient.downloadContent();\nString text = content.toString();\n\n\u002F\u002F Download to file\nblobClient.downloadToFile(\"downloaded-file.txt\");\n```\n\n### Download to Stream\n\n```java\ntry (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {\n    blobClient.downloadStream(outputStream);\n    byte[] data = outputStream.toByteArray();\n}\n```\n\n### Download with InputStream\n\n```java\nimport com.azure.storage.blob.specialized.BlobInputStream;\n\ntry (BlobInputStream blobIS = blobClient.openInputStream()) {\n    byte[] buffer = new byte[1024];\n    int bytesRead;\n    while ((bytesRead = blobIS.read(buffer)) != -1) {\n        \u002F\u002F Process buffer\n    }\n}\n```\n\n### Upload via OutputStream\n\n```java\nimport com.azure.storage.blob.specialized.BlobOutputStream;\n\ntry (BlobOutputStream blobOS = blobClient.getBlockBlobClient().getBlobOutputStream()) {\n    blobOS.write(\"Data to upload\".getBytes());\n}\n```\n\n### List Blobs\n\n```java\nimport com.azure.storage.blob.models.BlobItem;\n\n\u002F\u002F List all blobs\nfor (BlobItem blobItem : containerClient.listBlobs()) {\n    System.out.println(\"Blob: \" + blobItem.getName());\n}\n\n\u002F\u002F List with prefix (virtual directory)\nimport com.azure.storage.blob.models.ListBlobsOptions;\n\nListBlobsOptions options = new ListBlobsOptions().setPrefix(\"folder\u002F\");\nfor (BlobItem blobItem : containerClient.listBlobs(options, null)) {\n    System.out.println(\"Blob: \" + blobItem.getName());\n}\n```\n\n### List Blobs by Hierarchy\n\n```java\nimport com.azure.storage.blob.models.BlobListDetails;\n\nString delimiter = \"\u002F\";\nListBlobsOptions options = new ListBlobsOptions()\n    .setPrefix(\"data\u002F\")\n    .setDetails(new BlobListDetails().setRetrieveMetadata(true));\n\nfor (BlobItem item : containerClient.listBlobsByHierarchy(delimiter, options, null)) {\n    if (item.isPrefix()) {\n        System.out.println(\"Directory: \" + item.getName());\n    } else {\n        System.out.println(\"Blob: \" + item.getName());\n    }\n}\n```\n\n### Delete Blob\n\n```java\nblobClient.delete();\n\n\u002F\u002F Delete if exists\nblobClient.deleteIfExists();\n\n\u002F\u002F Delete with snapshots\nimport com.azure.storage.blob.models.DeleteSnapshotsOptionType;\nblobClient.deleteWithResponse(DeleteSnapshotsOptionType.INCLUDE, null, null, Context.NONE);\n```\n\n### Copy Blob\n\n```java\nimport com.azure.storage.blob.models.BlobCopyInfo;\nimport com.azure.core.util.polling.SyncPoller;\n\n\u002F\u002F Async copy (for large blobs or cross-account)\nSyncPoller\u003CBlobCopyInfo, Void> poller = blobClient.beginCopy(\"\u003Csource-blob-url>\", Duration.ofSeconds(1));\npoller.waitForCompletion();\n\n\u002F\u002F Sync copy from URL (for same account)\nblobClient.copyFromUrl(\"\u003Csource-blob-url>\");\n```\n\n### Generate SAS Token\n\n```java\nimport com.azure.storage.blob.sas.*;\nimport java.time.OffsetDateTime;\n\n\u002F\u002F Blob-level SAS\nBlobSasPermission permissions = new BlobSasPermission().setReadPermission(true);\nOffsetDateTime expiry = OffsetDateTime.now().plusDays(1);\n\nBlobServiceSasSignatureValues sasValues = new BlobServiceSasSignatureValues(expiry, permissions);\nString sasToken = blobClient.generateSas(sasValues);\n\n\u002F\u002F Container-level SAS\nBlobContainerSasPermission containerPermissions = new BlobContainerSasPermission()\n    .setReadPermission(true)\n    .setListPermission(true);\n    \nBlobServiceSasSignatureValues containerSasValues = new BlobServiceSasSignatureValues(expiry, containerPermissions);\nString containerSas = containerClient.generateSas(containerSasValues);\n```\n\n### Blob Properties and Metadata\n\n```java\nimport com.azure.storage.blob.models.BlobProperties;\n\n\u002F\u002F Get properties\nBlobProperties properties = blobClient.getProperties();\nSystem.out.println(\"Size: \" + properties.getBlobSize());\nSystem.out.println(\"Content-Type: \" + properties.getContentType());\nSystem.out.println(\"Last Modified: \" + properties.getLastModified());\n\n\u002F\u002F Set metadata\nMap\u003CString, String> metadata = Map.of(\"key1\", \"value1\", \"key2\", \"value2\");\nblobClient.setMetadata(metadata);\n\n\u002F\u002F Set HTTP headers\nBlobHttpHeaders headers = new BlobHttpHeaders()\n    .setContentType(\"application\u002Fjson\")\n    .setCacheControl(\"max-age=86400\");\nblobClient.setHttpHeaders(headers);\n```\n\n### Lease Blob\n\n```java\nimport com.azure.storage.blob.specialized.BlobLeaseClient;\nimport com.azure.storage.blob.specialized.BlobLeaseClientBuilder;\n\nBlobLeaseClient leaseClient = new BlobLeaseClientBuilder()\n    .blobClient(blobClient)\n    .buildClient();\n\n\u002F\u002F Acquire lease (-1 for infinite)\nString leaseId = leaseClient.acquireLease(60);\n\n\u002F\u002F Renew lease\nleaseClient.renewLease();\n\n\u002F\u002F Release lease\nleaseClient.releaseLease();\n```\n\n## Error Handling\n\n```java\nimport com.azure.storage.blob.models.BlobStorageException;\n\ntry {\n    blobClient.download(outputStream);\n} catch (BlobStorageException e) {\n    System.out.println(\"Status: \" + e.getStatusCode());\n    System.out.println(\"Error code: \" + e.getErrorCode());\n    \u002F\u002F 404 = Blob not found\n    \u002F\u002F 409 = Conflict (lease, etc.)\n}\n```\n\n## Proxy Configuration\n\n```java\nimport com.azure.core.http.ProxyOptions;\nimport com.azure.core.http.netty.NettyAsyncHttpClientBuilder;\nimport java.net.InetSocketAddress;\n\nProxyOptions proxyOptions = new ProxyOptions(\n    ProxyOptions.Type.HTTP,\n    new InetSocketAddress(\"localhost\", 8888));\n\nBlobServiceClient client = new BlobServiceClientBuilder()\n    .endpoint(\"\u003Cendpoint>\")\n    .sasToken(\"\u003Csas-token>\")\n    .httpClient(new NettyAsyncHttpClientBuilder().proxy(proxyOptions).build())\n    .buildClient();\n```\n\n## Environment Variables\n\n```bash\nAZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=...  # Alternative to Entra ID auth\nAZURE_STORAGE_ACCOUNT_URL=https:\u002F\u002F\u003Caccount>.blob.core.windows.net  # Required for all auth methods\nAZURE_TOKEN_CREDENTIALS=prod  # Required only if DefaultAzureCredential is used in production\n```\n\n## Trigger Phrases\n\n- \"Azure Blob Storage Java\"\n- \"upload download blob\"\n- \"blob container SDK\"\n- \"storage streaming\"\n- \"SAS token generation\"\n- \"blob metadata properties\"\n",{"name":5,"license":15,"metadata":24,"description":7},{"author":25,"package":26,"version":27},"Microsoft","com.azure:azure-storage-blob","1.0.0","master","c247302c836de6438d746b45670990eb71691166","skills_collected\u002Fmicrosoft--skills--.github__plugins__azure-sdk-java__skills__azure-storage-blob-java",1,"https:\u002F\u002Fgithub.com\u002Fqhjqhj00\u002Fresearch-skills-pool","https:\u002F\u002Fgithub.com\u002Fqhjqhj00","chien.io","2026-05-11 15:07:59",{"source":8,"skillName":5,"commands":37,"prompt":47,"zipAvailable":48},[38,41,44],{"tool":39,"command":40},"npx","npx skills add qhjqhj00\u002Fresearch-skills-pool --skill azure-storage-blob-java",{"tool":42,"command":43},"bunx","bunx skills add qhjqhj00\u002Fresearch-skills-pool --skill azure-storage-blob-java",{"tool":45,"command":46},"pnpm","pnpm dlx skills add qhjqhj00\u002Fresearch-skills-pool --skill azure-storage-blob-java","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fqhjqhj00\u002Fresearch-skills-pool\u002Fblob\u002Fmaster\u002Fskills_collected\u002Fmicrosoft--skills--.github__plugins__azure-sdk-java__skills__azure-storage-blob-java\u002FSKILL.md",true,[50],{"path":51,"resourceType":52,"resourceTypeDesc":53,"sizeBytes":54,"sourceHtmlUrl":55},"references\u002Fexamples.md","REFERENCE","参考文档",11617,"https:\u002F\u002Fgithub.com\u002Fqhjqhj00\u002Fresearch-skills-pool\u002Fblob\u002Fmaster\u002Fskills_collected\u002Fmicrosoft--skills--.github__plugins__azure-sdk-java__skills__azure-storage-blob-java\u002Freferences\u002Fexamples.md",[57,64,71,78,85,92],{"skillNo":58,"name":59,"nameZh":6,"description":60,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":61,"categories":62,"keywords":63,"publishedAt":19},"01M73JJB6EQPFPPVQK2Y9N67Q0","transformer-lens-interpretability","Provides guidance for mechanistic interpretability research using TransformerLens to inspect and manipulate transformer internals via HookPoints and activation caching. Use when reverse-engineering model algorithms, studying attention patterns, or performing activation patching experiments.","https:\u002F\u002Fgithub.com\u002Fqhjqhj00\u002Fresearch-skills-pool\u002Fblob\u002Fmaster\u002Ftop100-runs\u002F130-transformer-lens\u002FSKILL.md",[],[],{"skillNo":65,"name":66,"nameZh":6,"description":67,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":68,"categories":69,"keywords":70,"publishedAt":19},"01M73JHTANRRWEE9HP98TPEHAY","wiki-vitepress","Packages generated wiki Markdown into a VitePress static site with dark theme, dark-mode Mermaid diagrams with click-to-zoom, and production build output. Use when the user wants to create a browsable website from generated wiki pages.","https:\u002F\u002Fgithub.com\u002Fqhjqhj00\u002Fresearch-skills-pool\u002Fblob\u002Fmaster\u002Ftop100-runs\u002F126-wiki-vitepress\u002FSKILL.md",[],[],{"skillNo":72,"name":73,"nameZh":6,"description":74,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":77,"publishedAt":19},"01M73JHJBMVFW46F1Y8K3SBF43","phoenix-observability","Open-source AI observability platform for LLM tracing, evaluation, and monitoring. Use when debugging LLM applications with detailed traces, running evaluations on datasets, or monitoring production AI systems with real-time insights.","https:\u002F\u002Fgithub.com\u002Fqhjqhj00\u002Fresearch-skills-pool\u002Fblob\u002Fmaster\u002Ftop100-runs\u002F124-phoenix\u002FSKILL.md",[],[],{"skillNo":79,"name":80,"nameZh":6,"description":81,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":84,"publishedAt":19},"01M73JHFPA3A2806PMP42ZN86Q","frontend-ui-dark-ts","Build dark-themed React applications using Tailwind CSS with custom theming, glassmorphism effects, and Framer Motion animations. Use when creating dashboards, admin panels, or data-rich interfaces with a refined dark aesthetic.","https:\u002F\u002Fgithub.com\u002Fqhjqhj00\u002Fresearch-skills-pool\u002Fblob\u002Fmaster\u002Ftop100-runs\u002F123-frontend-ui-dark-ts\u002FSKILL.md",[],[],{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":91,"publishedAt":19},"01M73JFVBVK57NRJS49TT2VDCT","tensorboard","Visualize training metrics, debug models with histograms, compare experiments, visualize model graphs, and profile performance with TensorBoard - Google's ML visualization toolkit","https:\u002F\u002Fgithub.com\u002Fqhjqhj00\u002Fresearch-skills-pool\u002Fblob\u002Fmaster\u002Ftop100-runs\u002F113-tensorboard\u002FSKILL.md",[],[],{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":96,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":99,"publishedAt":19},"01M73JFF6PK6ZCN41C89J7HS2B","markdown-mermaid-writing","Comprehensive markdown and Mermaid diagram writing skill. Use when creating any scientific document, report, analysis, or visualization. Establishes text-based diagrams as the default documentation standard with full style guides (markdown + mermaid), 24 diagram type references, and 9 document templates.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fqhjqhj00\u002Fresearch-skills-pool\u002Fblob\u002Fmaster\u002Ftop100-runs\u002F110-markdown-mermaid-writing\u002FSKILL.md",[],[]]