使用 Java 删除和还原 Blob

本文介绍了如何使用适用于 Java 的 Azure 存储客户端库删除 Blob。 如果已启用 Blob 软删除,则可以在保持期内还原已删除的 Blob。

先决条件

  • 本文假设已经设置了项目来使用适用于 Java 的 Azure Blob 存储客户端库。 要了解有关设置项目的信息,包括包安装、添加 import 指令和创建授权客户端对象,请参阅开始使用 Azure 存储和 Java
  • 授权机制必须具有删除 blob 或还原软删除 blob 的权限。 若要了解详细信息,请参阅以下 REST API 操作的授权指南:

删除 Blob

若要删除 Blob,请调用以下一种方法:

下面的示例删除 Blob:

public void deleteBlob(BlobClient blobClient) {
    blobClient.delete();
}

如果 Blob 具有任何关联的快照,则必须删除其所有快照才能删除该 Blob。 以下示例删除一个 Blob 及其快照,并显示了响应:

public void deleteBlobWithSnapshots(BlobClient blobClient) {
    Response<Boolean> response = blobClient.deleteIfExistsWithResponse(DeleteSnapshotsOptionType.INCLUDE, null,
            null,
            new Context("key", "value"));
    if (response.getStatusCode() == 404) {
        System.out.println("Blob does not exist");
    } else {
        System.out.printf("Delete blob completed with status %d%n", response.getStatusCode());
    }
}

若要仅删除快照,而不删除 Blob 本身,可以传递参数 DeleteSnapshotsOptionType.ONLY

还原已删除的 Blob

Blob 软删除会在系统中将已删除的数据保留指定的一段时间,可以在意外删除或覆盖单个 Blob 及其版本、快照和元数据时提供保护。 在保留期内,可以将 Blob 还原到它在删除时的状态。 在指定的保留期已过后,Blob 将永久被删除。 有关 Blob 软删除的详细信息,请参阅 Blob 的软删除

可以使用 Azure 存储客户端库来还原软删除的 Blob 或快照。

还原软删除的 Blob 的方式取决于存储帐户是否启用了 Blob 版本控制。 有关 Blob 版本控制的详细信息,请参阅 Blob 版本控制。 请根据你的情况,查看以下部分之一:

禁用版本控制时还原软删除的对象

若要还原已删除的 Blob,请调用以下方法:

此方法还原软删除的 Blob 以及任何关联的软删除快照的内容和元数据。 对未删除的 Blob 调用此方法不会起作用。

public void restoreBlob(BlobClient blobClient) {
    blobClient.undelete();
}

启用版本控制时还原软删除的对象

如果将存储帐户配置为启用 blob 版本控制,则删除 blob 会导致 blob 的当前版本成为以前的版本。 若要在启用了版本控制的情况下还原软删除的 Blob,请将前一个版本复制到基础 Blob。 可使用以下方法:

此方法还原软删除的 Blob 以及任何关联的软删除快照的内容和元数据。 对未删除的 Blob 调用此方法不会起作用。

public void restoreBlobVersion(BlobContainerClient containerClient, BlobClient blobClient){
    // List blobs in this container that match the prefix
    // Include versions in the listing
    ListBlobsOptions options = new ListBlobsOptions()
            .setPrefix(blobClient.getBlobName())
            .setDetails(new BlobListDetails()
                    .setRetrieveVersions(true));
    Iterator<BlobItem> blobItem = containerClient.listBlobs(options, null).iterator();
    List<String> blobVersions = new ArrayList<>();
    while (blobItem.hasNext()) {
        blobVersions.add(blobItem.next().getVersionId());
    }

    // Sort the list of blob versions and get the most recent version ID
    Collections.sort(blobVersions, Collections.reverseOrder());
    String latestVersion = blobVersions.get(0);

    // Get a client object with the name of the deleted blob and the specified version
    BlobClient blob = containerClient.getBlobVersionClient("sampleBlob.txt", latestVersion);

    // Restore the most recent version by copying it to the base blob
    blobClient.copyFromUrl(blob.getBlobUrl());
}

还原被软删除的 Blob 和目录(分层命名空间)

重要

本部分仅适用于具有分层命名空间的帐户。

  1. 若要开始操作,请在文本编辑器中打开 pom.xml 文件。 将以下依赖项元素添加到依赖项组。

    <dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-storage-file-datalake</artifactId>
      <version>12.6.0</version>
    </dependency>
    
  2. 然后将这些 imports 语句添加到代码文件。

    Put imports here
    
  3. 以下代码片段将还原名为 my-file 的软删除文件。

    此方法假定你已创建 DataLakeServiceClient 实例。 若要了解如何创建 DataLakeServiceClient 实例,请参阅连接到帐户

    
    public void RestoreFile(DataLakeServiceClient serviceClient){
    
        DataLakeFileSystemClient fileSystemClient =
            serviceClient.getFileSystemClient("my-container");
    
        DataLakeFileClient fileClient =
            fileSystemClient.getFileClient("my-file");
    
        String deletionId = null;
    
        for (PathDeletedItem item : fileSystemClient.listDeletedPaths()) {
    
            if (item.getName().equals(fileClient.getFilePath())) {
               deletionId = item.getDeletionId();
            }
        }
    
        fileSystemClient.restorePath(fileClient.getFilePath(), deletionId);
     }
    
    

    如果你重命名了包含软删除项的目录,则这些项会与目录断开连接。 如果要还原这些项,则必须将目录的名称还原为原始名称,或者创建一个使用原始目录名称的单独目录。 否则,在尝试还原这些软删除项时,会出现错误。

资源

若要详细了解如何使用适用于 Java 的 Azure Blob 存储客户端库来删除 Blob 和还原已删除的 Blob,请参阅以下资源。

REST API 操作

Azure SDK for Java 包含基于 Azure REST API 而生成的库,允许你通过熟悉的 Java 范例与 REST API 操作进行交互。 用于删除 Blob 和还原已删除 Blob 的客户端库方法使用以下 REST API 操作:

代码示例

客户端库资源

另请参阅