Java を使用して Azure Data Lake Storage Gen2 のディレクトリとファイルを管理する

この記事では、階層型名前空間が有効になっているストレージ アカウントで、Java を使用してディレクトリとファイルを作成および管理する方法を示します。

ディレクトリとファイルのアクセス制御リスト (ACL) を取得、設定、および更新する方法については、Azure Data Lake Storage Gen2 で .Java を使用してデータを管理する方法に関するページを参照してください。

パッケージ (Maven) | サンプル | API リファレンス | Gen1 から Gen2 へのマッピング | フィードバックを送る

前提条件

  • Azure サブスクリプション。 詳細については、Azure 無料試用版の取得に関するページを参照してください。

  • 階層型名前空間が有効になっているストレージ アカウント。 作成するには、こちらの手順に従います。

プロジェクトの設定

開始するには、こちらのページにアクセスして、最新バージョンの Java ライブラリを検索します。 次に、お使いのテキスト エディターで pom.xml ファイルを開きます。 該当のバージョンを参照する依存関係要素を追加します。

Microsoft Entra ID を使ってクライアント アプリケーションの認証を行うことを計画している場合は、Azure ID ライブラリに依存関係を追加します。 詳しくは、「Java 用 Azure ID クライアント ライブラリ」を参照してください。

次に、以下の import ステートメントをコード ファイルに追加します。

import com.azure.identity.*;
import com.azure.storage.common.StorageSharedKeyCredential;
import com.azure.core.http.rest.PagedIterable;
import com.azure.core.util.BinaryData;
import com.azure.storage.file.datalake.*;
import com.azure.storage.file.datalake.models.*;
import com.azure.storage.file.datalake.options.*;

Note

Data Lake Storage のマルチプロトコル アクセスでは、アプリケーションは BLOB API と Data Lake Storage Gen2 API の両方を使用して、階層型名前空間 (HNS) が有効なストレージ アカウント内のデータを操作できます。 ディレクトリ操作や ACL など、Data Lake Storage Gen2 に固有の機能を使用する場合は、この記事に示すように Data Lake Storage Gen2 API を使用します。

特定のシナリオで使用する API を選択する場合は、ワークロードとアプリケーションのニーズを、既知の問題HNS がワークロードとアプリケーションに与える影響と一緒に考慮してください。

データ リソースへのアクセスを認可して接続する

この記事のコード例を使用するには、ストレージ アカウントを表す認可済みの DataLakeServiceClient インスタンスを作成する必要があります。 Microsoft Entra ID、アカウント アクセス キー、または Shared Access Signature (SAS) を使って、DataLakeServiceClient オブジェクトを承認できます。

Java 用 Azure ID クライアント ライブラリを使って、Microsoft Entra ID でアプリケーションを認証できます。

DataLakeServiceClient インスタンスを作成し、DefaultAzureCredential クラスの新しいインスタンスを渡します。

static public DataLakeServiceClient GetDataLakeServiceClient(String accountName){
    DefaultAzureCredential defaultCredential = new DefaultAzureCredentialBuilder().build();

    DataLakeServiceClient dataLakeServiceClient = new DataLakeServiceClientBuilder()
        .endpoint("https://" + accountName + ".dfs.core.windows.net")
        .credential(defaultCredential)
        .buildClient();

    return dataLakeServiceClient;
}

DefaultAzureCredential を使ってデータへのアクセスを承認する方法について詳しくは、「Java 用 Azure ID クライアント ライブラリ」をご覧ください。

コンテナーを作成する

コンテナーは、ファイルのファイル システムとして機能します。 次のメソッドを使用して、コンテナーを作成できます。

次のコード例では、コンテナーを作成し、後で使用する DataLakeFileSystemClient オブジェクトを返します:

public DataLakeFileSystemClient CreateFileSystem(
        DataLakeServiceClient serviceClient,
        String fileSystemName) {

    DataLakeFileSystemClient fileSystemClient = serviceClient.createFileSystem(fileSystemName);

    return fileSystemClient;
}

ディレクトリを作成する

次のメソッドを使用して、コンテナー内にディレクトリ参照を作成できます。

次のコード例では、コンテナーにディレクトリを追加した後に、サブディレクトリを追加し、後で使用するために DataLakeDirectoryClient オブジェクトを返します。

public DataLakeDirectoryClient CreateDirectory(
        DataLakeFileSystemClient fileSystemClient,
        String directoryName,
        String subDirectoryName) {

    DataLakeDirectoryClient directoryClient = fileSystemClient.createDirectory(directoryName);

    return directoryClient.createSubdirectory(subDirectoryName);
}

ディレクトリの名前変更または移動

次のメソッドを使用して、ディレクトリの名前の変更または移動を行うことができます。

目的のディレクトリ パスをパラメーターに渡します。 次のコード例は、サブディレクトリの名前の変更方法を示しています。

public DataLakeDirectoryClient RenameDirectory(
        DataLakeFileSystemClient fileSystemClient,
        String directoryPath,
        String subdirectoryName,
        String subdirectoryNameNew) {

    DataLakeDirectoryClient directoryClient = fileSystemClient
            .getDirectoryClient(String.join("/", directoryPath, subdirectoryName));

    return directoryClient.rename(
            fileSystemClient.getFileSystemName(),
            String.join("/", directoryPath, subdirectoryNameNew));
}

次のコード例は、サブディレクトリをあるディレクトリから別のディレクトリに移動する方法を示しています。

public DataLakeDirectoryClient MoveDirectory(
        DataLakeFileSystemClient fileSystemClient,
        String directoryPathFrom,
        String directoryPathTo,
        String subdirectoryName) {

    DataLakeDirectoryClient directoryClient = fileSystemClient
            .getDirectoryClient(String.join("/", directoryPathFrom, subdirectoryName));

    return directoryClient.rename(
            fileSystemClient.getFileSystemName(),
            String.join("/", directoryPathTo, subdirectoryName));
}

ファイルをディレクトリにアップロードする

次のメソッドを使用して、新規または既存のファイルにコンテンツをアップロードできます。

次のコード例は、uploadFromFile メソッドを使用してローカル ファイルをディレクトリにアップロードする方法を示しています。

public void UploadFile(
        DataLakeDirectoryClient directoryClient,
        String fileName) {

    DataLakeFileClient fileClient = directoryClient.getFileClient(fileName);

    fileClient.uploadFromFile("filePath/sample-file.txt");
}

このメソッドを使用してコンテンツを作成して新しいファイルにアップロードすることも、overwrite パラメーターを true に設定して既存のファイルを上書きすることもできます。

ファイルにデータを追加する

次のメソッドを使用して、ファイルに追加するデータをアップロードできます。

次のコード例は、これらの手順を使用してファイルの末尾にデータを追加する方法を示しています。

  • 操作しているファイル リソースを表す DataLakeFileClient オブジェクトを作成します。
  • DataLakeFileClient.append メソッドを使ってファイルにデータをアップロードします。
  • DataLakeFileClient.flush メソッドを呼び出し、前にアップロードしたデータをファイルに書き込むことで、アップロードを完了します。
public void AppendDataToFile(
        DataLakeDirectoryClient directoryClient) {

    DataLakeFileClient fileClient = directoryClient.getFileClient("sample-file.txt");
    long fileSize = fileClient.getProperties().getFileSize();

    String sampleData = "Data to append to end of file";
    fileClient.append(BinaryData.fromString(sampleData), fileSize);

    fileClient.flush(fileSize + sampleData.length(), true);
}

ディレクトリからダウンロードする

次のコード例は、これらの手順を使用して、ディレクトリからローカル ファイルへとファイルをダウンロードする方法を示しています。

  • ダウンロードしたいファイルを表す DataLakeFileClient オブジェクトを作成します。
  • DataLakeFileClient.readToFile メソッドを使ってファイルを読み取ります。 次の使用例は、 パラメーターを overwritetrue設定し、既存のファイルを上書きします。
public void DownloadFile(
        DataLakeDirectoryClient directoryClient,
        String fileName) {

    DataLakeFileClient fileClient = directoryClient.getFileClient(fileName);

    fileClient.readToFile("filePath/sample-file.txt", true);
}

ディレクトリの内容を一覧表示する

次のメソッドを使用し結果を列挙することで、ディレクトリのコンテンツを一覧表示できます。

結果内のパスの列挙は、値のフェッチ中にサービスに対して複数の要求を行う場合があります。

次のコード例では、ディレクトリにある各ファイルの名前を出力します。

public void ListFilesInDirectory(
        DataLakeFileSystemClient fileSystemClient,
        String directoryName) {

    ListPathsOptions options = new ListPathsOptions();
    options.setPath(directoryName);

    PagedIterable<PathItem> pagedIterable = fileSystemClient.listPaths(options, null);

    java.util.Iterator<PathItem> iterator = pagedIterable.iterator();
    PathItem item = iterator.next();

    while (item != null) {
        System.out.println(item.getName());

        if (!iterator.hasNext()) {
            break;
        }
        item = iterator.next();
    }

}

ディレクトリを削除する

次のいずれかのメソッドを使用して、ディレクトリを削除できます:

次のコード例では、deleteWithResponse を使用して、空でないディレクトリとディレクトリの下にあるすべてのパスを削除します:

public void DeleteDirectory(
        DataLakeFileSystemClient fileSystemClient,
        String directoryName) {

    DataLakeDirectoryClient directoryClient = fileSystemClient.getDirectoryClient(directoryName);

    // Set to true to delete all paths beneath the directory
    boolean recursive = true;

    directoryClient.deleteWithResponse(recursive, null, null, null);
}

関連項目