开发使用 Azure 文件存储的 Java 应用程序

了解开发使用 Azure 文件存储来存储数据的 Java 应用程序的基础知识。 使用 Azure 文件存储 API 创建控制台应用程序并了解基本操作:

  • 创建和删除 Azure 文件共享
  • 创建和删除目录
  • 枚举 Azure 文件共享中的文件和目录
  • 上传、下载和删除文件

提示

查看 Azure 存储代码示例存储库

如需易用且能够下载和运行的端到端 Azure 存储代码示例,请查看我们的 Azure 存储示例列表。

适用于

文件共享类型 SMB NFS
标准文件共享 (GPv2)、LRS/ZRS 是 否
标准文件共享 (GPv2)、GRS/GZRS 是 否
高级文件共享 (FileStorage)、LRS/ZRS 是 否

创建 Java 应用程序

若要生成示例,需要 Java 开发工具包 (JDK) 和适用于 Java 的 Azure 存储 SDK。 此外还需要一个 Azure 存储帐户。

设置应用程序以使用 Azure 文件

若要使用 Azure 文件存储 API,请将以下代码添加到要通过其访问 Azure 文件存储的 Java 文件的顶部。

// Include the following imports to use Azure Files APIs
import com.azure.storage.file.share.*;

设置 Azure 存储连接字符串

要使用 Azure 文件,需要连接到 Azure 存储帐户。 配置连接字符串并使用它连接到存储帐户。 定义用于保存连接字符串的静态变量。

将 <storage_account_name> 和 <storage_account_key> 替换为存储帐户的实际值。

// Define the connection-string.
// Replace the values, including <>, with
// the values from your storage account.
public static final String connectStr = 
   "DefaultEndpointsProtocol=https;" +
   "AccountName=<storage_account_name>;" +
   "AccountKey=<storage_account_key>"; +
   "EndpointSuffix=core.Chinacloudapi.cn";

访问 Azure 文件共享

若要访问 Azure 文件存储,请创建一个 ShareClient 对象。 使用 ShareClientBuilder 类生成新的 ShareClient 对象。

ShareClient shareClient = new ShareClientBuilder()
    .connectionString(connectStr).shareName(shareName)
    .buildClient();

创建文件共享

Azure 文件存储中的所有文件和目录都存储在名为共享的容器内。

如果共享已经存在,则 ShareClient.create 方法将引发异常。 将对 create 的调用置于 try/catch 块中并处理异常。

public static Boolean createFileShare(String connectStr, String shareName)
{
    try
    {
        ShareClient shareClient = new ShareClientBuilder()
            .connectionString(connectStr).shareName(shareName)
            .buildClient();

        shareClient.create();
        return true;
    }
    catch (Exception e)
    {
        System.out.println("createFileShare exception: " + e.getMessage());
        return false;
    }
}

删除文件共享

以下示例代码将删除文件共享。

通过调用 ShareClient.delete 方法删除共享。

public static Boolean deleteFileShare(String connectStr, String shareName)
{
    try
    {
        ShareClient shareClient = new ShareClientBuilder()
            .connectionString(connectStr).shareName(shareName)
            .buildClient();

        shareClient.delete();
        return true;
    }
    catch (Exception e)
    {
        System.out.println("deleteFileShare exception: " + e.getMessage());
        return false;
    }
}

创建目录

将文件置于子目录中,而不是将其全部置于根目录中,以便对存储进行整理。

以下代码通过调用 ShareDirectoryClient.create 创建目录。 示例方法返回一个 Boolean 值,该值指示它是否成功创建了目录。

public static Boolean createDirectory(String connectStr, String shareName,
                                        String dirName)
{
    try
    {
        ShareDirectoryClient dirClient = new ShareFileClientBuilder()
             .connectionString(connectStr).shareName(shareName)
             .resourcePath(dirName)
             .buildDirectoryClient();

        dirClient.create();
        return true;
    }
    catch (Exception e)
    {
        System.out.println("createDirectory exception: " + e.getMessage());
        return false;
    }
}

删除目录

删除目录是一项简单的任务。 你无法删除仍包含文件或子目录的目录。

如果目录不存在或不为空,则 ShareDirectoryClient.delete 方法将引发异常。 将对 delete 的调用置于 try/catch 块中并处理异常。

public static Boolean deleteDirectory(String connectStr, String shareName,
                                        String dirName)
{
    try
    {
        ShareDirectoryClient dirClient = new ShareFileClientBuilder()
             .connectionString(connectStr).shareName(shareName)
             .resourcePath(dirName)
             .buildDirectoryClient();

        dirClient.delete();
        return true;
    }
    catch (Exception e)
    {
        System.out.println("deleteDirectory exception: " + e.getMessage());
        return false;
    }
}

枚举 Azure 文件共享中的文件和目录

通过调用 ShareDirectoryClient.listFilesAndDirectories 获取文件和目录的列表。 该方法会返回可循环访问的 ShareFileItem 对象的列表。 以下代码将列出 dirName 参数指定的目录内的文件和目录。

public static Boolean enumerateFilesAndDirs(String connectStr, String shareName,
                                                String dirName)
{
    try
    {
        ShareDirectoryClient dirClient = new ShareFileClientBuilder()
             .connectionString(connectStr).shareName(shareName)
             .resourcePath(dirName)
             .buildDirectoryClient();

        dirClient.listFilesAndDirectories().forEach(
            fileRef -> System.out.printf("Resource: %s\t Directory? %b\n",
            fileRef.getName(), fileRef.isDirectory())
        );

        return true;
    }
    catch (Exception e)
    {
        System.out.println("enumerateFilesAndDirs exception: " + e.getMessage());
        return false;
    }
}

上传文件

了解如何从本地存储上传文件。

以下代码通过调用 ShareFileClient.uploadFromFile 方法将本地文件上传到 Azure 文件存储。 以下示例方法返回一个 Boolean 值,该值指示它是否成功上传了指定的文件。

public static Boolean uploadFile(String connectStr, String shareName,
                                    String dirName, String fileName)
{
    try
    {
        ShareDirectoryClient dirClient = new ShareFileClientBuilder()
             .connectionString(connectStr).shareName(shareName)
             .resourcePath(dirName)
             .buildDirectoryClient();

        ShareFileClient fileClient = dirClient.getFileClient(fileName);
        fileClient.create(1024);
        fileClient.uploadFromFile(fileName);
        return true;
    }
    catch (Exception e)
    {
        System.out.println("uploadFile exception: " + e.getMessage());
        return false;
    }
}

下载文件

较常见的操作之一是从 Azure 文件共享下载文件。

以下示例将指定文件下载到 destDir 参数中指定的本地目录。 示例方法通过在下载的文件名前面追加日期和时间,来实现文件名的唯一性。

public static Boolean downloadFile(String connectStr, String shareName,
                                    String dirName, String destDir,
                                        String fileName)
{
    try
    {
        ShareDirectoryClient dirClient = new ShareFileClientBuilder()
             .connectionString(connectStr).shareName(shareName)
             .resourcePath(dirName)
             .buildDirectoryClient();

        ShareFileClient fileClient = dirClient.getFileClient(fileName);

        // Create a unique file name
        String date = new java.text.SimpleDateFormat("yyyyMMdd-HHmmss").format(new java.util.Date());
        String destPath = destDir + "/"+ date + "_" + fileName;

        fileClient.downloadToFile(destPath);
        return true;
    }
    catch (Exception e)
    {
        System.out.println("downloadFile exception: " + e.getMessage());
        return false;
    }
}

删除文件

另一项常见的 Azure 文件操作是删除文件。

以下代码将删除指定文件。 首先,该示例基于 dirName 参数创建一个 ShareDirectoryClient。 然后,代码根据 fileName 参数从目录客户端获取 ShareFileClient。 最后,示例方法调用 ShareFileClient.delete 来删除文件。

public static Boolean deleteFile(String connectStr, String shareName,
                                    String dirName, String fileName)
{
    try
    {
        ShareDirectoryClient dirClient = new ShareFileClientBuilder()
             .connectionString(connectStr).shareName(shareName)
             .resourcePath(dirName)
             .buildDirectoryClient();

        ShareFileClient fileClient = dirClient.getFileClient(fileName);
        fileClient.delete();
        return true;
    }
    catch (Exception e)
    {
        System.out.println("deleteFile exception: " + e.getMessage());
        return false;
    }
}

后续步骤

如果还想更多地了解其他 Azure 存储 API,请点击以下链接。

有关使用已弃用的 Java 版本 8 SDK 的相关代码示例,请参阅使用 Java 版本 8 的代码示例