Verwenden von Java zum Verwalten von Verzeichnissen und Dateien in Azure Data Lake Storage Gen2

In diesem Artikel erfahren Sie, wie Sie mithilfe von Java Verzeichnisse und Dateien in Speicherkonten erstellen und verwalten, die über einen hierarchischen Namespace verfügen.

Informationen zum Abrufen, Festlegen und Aktualisieren der Zugriffssteuerungslisten (Access Control Lists, ACLs) von Verzeichnissen und Dateien finden Sie unter Verwenden von Java zum Verwalten von Zugriffssteuerungslisten in Azure Data Lake Storage Gen2.

Maven-Paket | Beispiele | API-Referenz | Zuordnung von Gen1 zu Gen2 | Feedback geben

Voraussetzungen

Einrichten des Projekts

Öffnen Sie zunächst diese Seite, und suchen Sie die neueste Version der Java-Bibliothek. Öffnen Sie dann die Datei pom.xml in Ihrem Text-Editor. Fügen Sie ein Abhängigkeitselement hinzu, das auf diese Version verweist.

Wenn Sie beabsichtigen, die Clientanwendung mithilfe von Microsoft Entra ID zu authentifizieren, fügen Sie der Azure-Identitätsbibliothek eine Abhängigkeit hinzu. Weitere Informationen finden Sie unter Azure Identity-Clientbibliothek für Java.

Fügen Sie als Nächstes Ihrer Codedatei die folgenden Import-Anweisungen hinzu.

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.*;

Hinweis

Der Multiprotokollzugriff auf Data Lake Storage ermöglicht Anwendungen die Verwendung von Blob-APIs und Data Lake Storage Gen2-APIs zum Arbeiten mit Daten in Speicherkonten mit aktiviertem hierarchischen Namespace (HNS). Wenn Sie mit speziellen Funktionen für Data Lake Storage Gen2 arbeiten, z. B. Verzeichnisvorgängen und ACLs, verwenden Sie die Data Lake Storage Gen2-APIs, wie in diesem Artikel gezeigt.

Berücksichtigen Sie bei der Auswahl der APIs, die in einem bestimmten Szenario verwendet werden sollen, die Workload und die Anforderungen Ihrer Anwendung sowie die bekannten Probleme und die Auswirkungen eines HNS auf Workloads und Anwendungen.

Autorisieren des Zugriffs und Herstellen einer Verbindung mit Datenressourcen

Um mit den Codebeispielen in diesem Artikel zu arbeiten, müssen Sie eine autorisierte DataLakeServiceClient-Instanz erstellen, die das Speicherkonto darstellt. Sie können ein DataLakeServiceClient-Objekt mithilfe von Microsoft Entra ID, einem Kontozugriffsschlüssels oder einer gemeinsamen Zugriffssignatur (Shared Access Signature, SAS) autorisieren.

Sie können die Azure-Identitätsclientbibliothek für Java verwenden, um Ihre Anwendung mit Microsoft Entra ID zu authentifizieren.

Erstellen Sie eine DataLakeServiceClient-Instanz und übergeben Sie eine neue Instanz der DefaultAzureCredential-Klasse.

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;
}

Weitere Informationen zur Verwendung von DefaultAzureCredential zum Autorisieren des Zugriffs auf Daten finden Sie im Artikel Azure Identity-Clientbibliothek für Java.

Erstellen eines Containers

Ein Container fungiert als Dateisystem für Ihre Dateien. Sie können einen Container mittels der folgenden Methode erstellen:

Im folgenden Codebeispiel wird ein Container erstellt und ein DataLakeFileSystemClient-Objekt zur späteren Verwendung zurückgegeben:

public DataLakeFileSystemClient CreateFileSystem(
        DataLakeServiceClient serviceClient,
        String fileSystemName) {

    DataLakeFileSystemClient fileSystemClient = serviceClient.createFileSystem(fileSystemName);

    return fileSystemClient;
}

Erstellen eines Verzeichnisses

Sie können einen Verzeichnisverweis im Container erstellen, indem Sie die folgende Methode verwenden:

Das folgende Codebeispiel fügt einem Container ein Verzeichnis hinzu, fügt dann ein Unterverzeichnis hinzu und gibt ein DataLakeDirectoryClient-Objekt zur späteren Verwendung zurück:

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

    DataLakeDirectoryClient directoryClient = fileSystemClient.createDirectory(directoryName);

    return directoryClient.createSubdirectory(subDirectoryName);
}

Umbenennen oder Verschieben eines Verzeichnisses

Sie können ein Verzeichnis mittels der folgenden Methode umbenennen oder verschieben:

Übergeben Sie den Pfad des gewünschten Verzeichnisses als Parameter. Das folgende Codebeispiel zeigt, wie ein Unterverzeichnis umbenannt wird:

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));
}

Das folgende Codebeispiel zeigt, wie ein Unterverzeichnis aus einem Verzeichnis in ein anderes Verzeichnis verschoben wird:

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));
}

Hochladen einer Datei in ein Verzeichnis

Sie können Inhalte mittels der folgenden Methode in eine neue oder vorhandene Datei hochladen:

Das folgende Codebeispiel zeigt, wie sie mithilfe der uploadFromFile-Methode eine lokale Datei in ein Verzeichnis hochladen:

public void UploadFile(
        DataLakeDirectoryClient directoryClient,
        String fileName) {

    DataLakeFileClient fileClient = directoryClient.getFileClient(fileName);

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

Sie können diese Methode verwenden, um Inhalte zu erstellen und in eine neue Datei hochzuladen, oder Sie können den overwrite-Parameter auf true festlegen, um eine vorhandene Datei zu überschreiben.

Anfügen von Daten an eine Datei

Sie können Daten hochladen, die an eine Datei angefügt werden sollen, indem Sie die folgende Methode verwenden:

Das folgende Codebeispiel zeigt, wie Sie mithilfe dieser Schritte Daten an das Ende einer Datei anfügen:

  • Erstellen Sie ein DataLakeFileClient-Objekt, das die Dateiressource repräsentiert, mit der Sie arbeiten.
  • Laden Sie Daten mit der DataLakeFileClient.append-Methode in die Datei hoch.
  • Schließen Sie den Upload ab, indem Sie die DataLakeFileClient.flush-Methode aufrufen, um die zuvor hochgeladenen Daten in die Datei zu schreiben.
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);
}

Herunterladen aus einem Verzeichnis

Das folgende Codebeispiel zeigt, wie Sie mithilfe dieser Schritte eine Datei aus einem Verzeichnis in eine lokale Datei herunterladen:

  • Erstellen Sie ein DataLakeFileClient-Objekt, das die Datei darstellt, die Sie herunterladen möchten.
  • Verwenden Sie die DataLakeFileClient.readToFile-Methode, um die Datei zu lesen. In diesem Beispiel wird der overwrite-Parameter auf true festgelegt, wodurch eine vorhandene Datei überschrieben wird.
public void DownloadFile(
        DataLakeDirectoryClient directoryClient,
        String fileName) {

    DataLakeFileClient fileClient = directoryClient.getFileClient(fileName);

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

Auflisten des Verzeichnisinhalts

Sie können Verzeichnisinhalte auflisten, indem Sie die folgende Methode verwenden und das Ergebnis aufzählen:

Beim Aufzählen der Pfade im Ergebnis werden möglicherweise mehrere Anforderungen an den Dienst gestellt, während die Werte abgerufen werden.

Das folgenden Codebeispiel gibt Namen aller Dateien aus, die sich in einem Verzeichnis befinden:

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();
    }

}

Löschen eines Verzeichnisses

Sie können ein Verzeichnis mittels einer der folgenden Methode löschen:

Im folgenden Codebeispiel wird deleteWithResponse verwendet, um ein nicht leeres Verzeichnis und alle Pfade unter dem Verzeichnis zu löschen:

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);
}

Siehe auch