使用 Java 设置或更改块 blob 的访问层

本文介绍了如何使用适用于 Java 的 Azure 存储客户端库设置或更改块 blob 的访问层。

先决条件

设置你的环境

如果没有现有项目,请查看本部分,其中介绍了如何设置项目来使用适用于 Java 的 Azure Blob 存储客户端库。 有关详细信息,请参阅 Azure Blob 存储和 Java 入门

要使用本文中的代码示例,请按照以下步骤设置项目。

注意

本文使用 Maven 生成工具来生成和运行示例代码。 其他生成工具(例如 Gradle)也可与 Azure SDK for Java 一起使用。

安装包

在文本编辑器中打开 pom.xml 文件。 通过包括 BOM 文件包括直接依赖项来安装包。

添加 import 语句

添加以下 import 语句:

import com.azure.core.util.polling.LongRunningOperationStatus;
import com.azure.core.util.polling.PollResponse;
import com.azure.core.util.polling.SyncPoller;
import com.azure.storage.blob.*;
import com.azure.storage.blob.models.*;
import com.azure.storage.blob.options.BlobBeginCopyOptions;

授权

授权机制必须具有设置 blob 的访问层所需的权限。 若要使用 Microsoft Entra ID 进行授权(建议),需要 Azure RBAC 内置角色“存储 Blob 数据参与者”或更高级别的角色。 有关详细信息,请参阅设置 Blob 层的授权指南。

创建客户端对象

若要将应用连接到 Blob 存储,请创建 BlobServiceClient 的实例。

以下示例使用 BlobServiceClientBuilder 生成一个使用 DefaultAzureCredentialBlobServiceClient 对象,并演示如何创建容器和 Blob 客户端(如果需要):

// Azure SDK client builders accept the credential as a parameter
// TODO: Replace <storage-account-name> with your actual storage account name
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
        .endpoint("https://<storage-account-name>.blob.core.chinacloudapi.cn/")
        .credential(new DefaultAzureCredentialBuilder().build())
        .buildClient();

// If needed, you can create a BlobContainerClient object from the BlobServiceClient
BlobContainerClient containerClient = blobServiceClient
        .getBlobContainerClient("<container-name>");

// If needed, you can create a BlobClient object from the BlobContainerClient
BlobClient blobClient = containerClient
        .getBlobClient("<blob-name>");

要详细了解如何创建和管理客户端对象,请参阅 创建和管理与数据资源交互的客户端对象

关于块 blob 访问层

要管理存储需求产生的成本,根据数据的访问频率和所需的保留期来整理数据会很有帮助。 Azure 存储提供不同的访问层,以便你可以基于使用方式,以最具成本效益的方式存储 Blob 数据。

Blob 数据的访问层

Azure 存储访问层包括:

  • 热层 - 适用于存储经常访问或修改的数据的联机层。 热层的存储成本最高,但访问成本最低。
  • 冷层 - 适用于存储不经常访问或修改的数据的联机层。 冷层中的数据应至少存储 30 天。 与热层相比,冷层的存储成本较低,访问成本较高。
  • 寒层 - 适用于存储不经常访问或修改的数据的联机层。 寒层中的数据应至少存储 90 天。 与冷层相比,寒层的存储成本较低,访问成本较高。
  • 存档层 - 适用于存储极少访问且延迟要求(以小时计)不严格的数据的脱机层。 存档层中的数据应至少存储 180 天。

若要详细了解访问层,请参阅 Blob 数据的访问层

当 Blob 位于存档访问层时,则会将其视为处于脱机状态,无法读取或修改。 若要读取或修改存档 Blob 中的数据,必须先将 Blob 解除冻结到联机层。 若要详细了解如何将 Blob 从存档层解除冻结到联机层,请参阅从存档层解除冻结 Blob

限制

仅允许在块 Blob 上设置访问层。 若要了解有关设置块 Blob 访问层的限制的详细信息,请参阅设置 Blob 层 (REST API)

注意

若要使用 Java 将访问层设置为 Cold,必须至少使用客户端库版本 12.21.0。

在上传期间设置 Blob 的访问层

可以使用 BlobUploadFromFileOptions 类在上传时设置 blob 的访问层。 以下代码示例演示如何在上传 blob 时设置访问层:

public void uploadBlobWithAccessTier(BlobContainerClient blobContainerClient, Path filePath) {
    String fileName = filePath.getFileName().toString();
    BlobClient blobClient = blobContainerClient.getBlobClient(fileName);

    BlobUploadFromFileOptions options = new BlobUploadFromFileOptions(filePath.toString())
            .setTier(AccessTier.COOL);

    try {
        Response<BlockBlobItem> blockBlob = blobClient.uploadFromFileWithResponse(options, null, null);
    } catch (UncheckedIOException ex) {
        System.err.printf("Failed to upload from file: %s%n", ex.getMessage());
    }
}

要详细了解如何使用 Java 上传 blob,请参阅使用 Java 上传 blob

更改现有的块 blob 的访问层

可以使用以下方法之一更改现有的块 blob 的访问层:

以下代码示例演示如何将现有 blob 的访问层更改为冷层:

public void changeBlobAccessTier(BlobClient blobClient) {
    // Change the blob's access tier to cool
    blobClient.setAccessTier(AccessTier.COOL);
}

如果要解除冻结存档的 Blob,请使用 setAccessTierWithResponse 方法。 将 tier 参数设置为 HOTCOOLARCHIVE 的有效 AccessTier 值。 可以选择将 priority 参数设置为有效的 RehydratePriorityHIGHSTANDARD

下面的代码示例演示如何通过将访问层更改为热层来解除冻结存档的 Blob:

public void rehydrateBlobSetAccessTier(BlobClient blobClient) {
    // Rehydrate the blob to hot tier using a standard rehydrate priority
    blobClient.setAccessTierWithResponse(
        AccessTier.HOT,
        RehydratePriority.STANDARD,
        null, 
        null, 
        null);
}

setAccessTierWithResponse 方法还可以接受 BlobSetAccessTierOptions 参数来指定配置选项。

将 blob 复制到不同的访问层

可以通过将访问层指定为复制操作的一部分来更改现有块 Blob 的访问层。 若要在复制操作期间更改访问层,请使用 BlobBeginCopyOptions 类。

可以使用 setTier 方法将 AccessTier 值指定为 HOTCOOLARCHIVE。 如果要使用复制操作从存档层解除冻结 Blob,请使用 setRehydratePriority 方法将 RehydratePriority 值指定为 HIGHSTANDARD

下面的代码示例演示如何使用复制操作将存档的 blob 解除冻结到热层:

public void rehydrateBlobUsingCopy(
    BlobClient sourceArchiveBlob,
    BlobClient destinationRehydratedBlob) {
    // Note: the destination blob must have a different name than the archived source blob

    // Start the copy operation and wait for it to complete
    final SyncPoller<BlobCopyInfo, Void> poller = destinationRehydratedBlob.beginCopy(
            new BlobBeginCopyOptions(sourceArchiveBlob.getBlobUrl())
                    .setTier(AccessTier.HOT)
                    .setRehydratePriority(RehydratePriority.STANDARD));
                    
    PollResponse<BlobCopyInfo> response = poller
            .waitUntil(LongRunningOperationStatus.SUCCESSFULLY_COMPLETED);
}

若要详细了解如何使用 Java 复制 blob,请参阅使用 Java 复制 blob

资源

若要详细了解如何使用适用于 Java 的 Azure Blob 存储客户端库来设置访问层,请参阅以下资源。

代码示例

REST API 操作

Azure SDK for Java 包含基于 Azure REST API 而生成的库,允许你通过熟悉的 Java 范例与 REST API 操作进行交互。 用于设置访问层的客户端库方法使用以下 REST API 操作:

客户端库资源

另请参阅

  • 本文是适用于 Java 的 Blob 存储开发人员指南的一部分。 若要了解详细信息,请参阅生成 Java 应用中的开发人员指南文章的完整列表。