Zarządzanie katalogami i plikami w usłudze Azure Data Lake Storage Gen2 przy użyciu języka Java

W tym artykule pokazano, jak używać języka Java do tworzenia katalogów i plików oraz zarządzania nimi na kontach magazynu, które mają hierarchiczną przestrzeń nazw.

Aby dowiedzieć się, jak pobierać, ustawiać i aktualizować listy kontroli dostępu (ACL) katalogów i plików, zobacz Use . Język Java do zarządzania listami ACL w usłudze Azure Data Lake Storage Gen2.

Package (Maven)Samples API reference Gen1 to Gen2 mapping Give Feedback (Package (Maven)Samples API reference Gen1 to Gen2 mapping (Package (Maven) | Samples | API reference | Gen1 to Gen2 mapping (Tworzenie mapowania |

Wymagania wstępne

konfigurowanie projektu

Aby rozpocząć, otwórz tę stronę i znajdź najnowszą wersję biblioteki Języka Java. Następnie otwórz plik pom.xml w edytorze tekstów. Dodaj element zależności, który odwołuje się do tej wersji.

Jeśli planujesz uwierzytelnić aplikację kliencką przy użyciu identyfikatora Entra firmy Microsoft, dodaj zależność do biblioteki tożsamości platformy Azure. Aby uzyskać więcej informacji, zobacz Biblioteka klienta usługi Azure Identity dla języka Java.

Następnie dodaj te instrukcje importowania do pliku kodu.

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

Uwaga

Dostęp do wielu protokołów w usłudze Data Lake Storage umożliwia aplikacjom korzystanie zarówno z interfejsów API obiektów blob, jak i interfejsów API usługi Data Lake Storage Gen2 do pracy z danymi na kontach magazynu z włączoną hierarchiczną przestrzenią nazw (HNS). Podczas pracy z funkcjami unikatowymi dla usługi Data Lake Storage Gen2, takimi jak operacje katalogów i listy ACL, użyj interfejsów API usługi Data Lake Storage Gen2, jak pokazano w tym artykule.

Podczas wybierania interfejsów API, które mają być używane w danym scenariuszu, należy wziąć pod uwagę obciążenie i potrzeby aplikacji wraz ze znanymi problemami i wpływem sieci HNS na obciążenia i aplikacje.

Autoryzowanie dostępu i nawiązywanie połączenia z zasobami danych

Aby pracować z przykładami kodu w tym artykule, należy utworzyć autoryzowane wystąpienie Elementu DataLakeServiceClient reprezentujące konto magazynu. Obiekt można autoryzować DataLakeServiceClient przy użyciu identyfikatora Entra firmy Microsoft, klucza dostępu do konta lub sygnatury dostępu współdzielonego (SAS).

Możesz użyć biblioteki klienta tożsamości platformy Azure dla języka Java do uwierzytelniania aplikacji za pomocą identyfikatora Entra firmy Microsoft.

Utwórz wystąpienie Elementu DataLakeServiceClient i przekaż nowe wystąpienie klasy 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;
}

Aby dowiedzieć się więcej na temat autoryzowania DefaultAzureCredential dostępu do danych, zobacz Biblioteka klienta tożsamości platformy Azure dla języka Java.

Tworzenie kontenera

Kontener działa jako system plików. Kontener można utworzyć przy użyciu następującej metody:

Poniższy przykład kodu tworzy kontener i zwraca obiekt DataLakeFileSystemClient do późniejszego użycia:

public DataLakeFileSystemClient CreateFileSystem(
        DataLakeServiceClient serviceClient,
        String fileSystemName) {

    DataLakeFileSystemClient fileSystemClient = serviceClient.createFileSystem(fileSystemName);

    return fileSystemClient;
}

Tworzenie katalogu

Odwołanie do katalogu można utworzyć w kontenerze przy użyciu następującej metody:

Poniższy przykład kodu dodaje katalog do kontenera, a następnie dodaje podkatalog i zwraca obiekt DataLakeDirectoryClient do późniejszego użycia:

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

    DataLakeDirectoryClient directoryClient = fileSystemClient.createDirectory(directoryName);

    return directoryClient.createSubdirectory(subDirectoryName);
}

Zmienianie nazwy lub przenoszenie katalogu

Możesz zmienić nazwę lub przenieść katalog przy użyciu następującej metody:

Przekaż ścieżkę żądanego katalogu jako parametr. W poniższym przykładzie kodu pokazano, jak zmienić nazwę podkatalogu:

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

Poniższy przykład kodu pokazuje, jak przenieść podkatalog z jednego katalogu do innego katalogu:

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

Przekazywanie pliku do katalogu

Zawartość można przekazać do nowego lub istniejącego pliku przy użyciu następującej metody:

W poniższym przykładzie kodu pokazano, jak przekazać plik lokalny do katalogu przy użyciu uploadFromFile metody :

public void UploadFile(
        DataLakeDirectoryClient directoryClient,
        String fileName) {

    DataLakeFileClient fileClient = directoryClient.getFileClient(fileName);

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

Za pomocą tej metody można utworzyć i przekazać zawartość do nowego pliku lub ustawić parametr na wartość , overwrite aby true zastąpić istniejący plik.

Dołączanie danych do pliku

Dane do dołączenia do pliku można przekazać przy użyciu następującej metody:

Poniższy przykład kodu pokazuje, jak dołączyć dane na końcu pliku, wykonując następujące kroki:

  • DataLakeFileClient Utwórz obiekt reprezentujący zasób pliku, z którym pracujesz.
  • Przekaż dane do pliku przy użyciu DataLakeFileClient.append metody .
  • Ukończ przekazywanie, wywołując metodę DataLakeFileClient.flush w celu zapisania wcześniej przekazanych danych do pliku.
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);
}

Pobieranie z katalogu

Poniższy przykład kodu pokazuje, jak pobrać plik z katalogu do pliku lokalnego, wykonując następujące kroki:

  • DataLakeFileClient Utwórz obiekt reprezentujący plik, który chcesz pobrać.
  • DataLakeFileClient.readToFile Użyj metody , aby odczytać plik. W tym przykładzie overwrite parametr ustawia wartość true, która zastępuje istniejący plik.
public void DownloadFile(
        DataLakeDirectoryClient directoryClient,
        String fileName) {

    DataLakeFileClient fileClient = directoryClient.getFileClient(fileName);

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

Wyświetlanie zawartości katalogu

Zawartość katalogu można wyświetlić przy użyciu następującej metody i wyliczyć wynik:

Wyliczanie ścieżek w wyniku może wysyłać wiele żądań do usługi podczas pobierania wartości.

Poniższy przykład kodu wyświetla nazwy każdego pliku znajdującego się w katalogu:

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

}

Usuwanie katalogu

Katalog można usunąć przy użyciu jednej z następujących metod:

Poniższy przykład kodu używa deleteWithResponse metody do usunięcia katalogu nonempty i wszystkich ścieżek pod katalogiem:

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

Zobacz też