Java gebruiken om mappen en bestanden te beheren in Azure Data Lake Storage Gen2

In dit artikel leest u hoe u Java gebruikt om mappen en bestanden te maken en beheren in opslagaccounts met een hiërarchische naamruimte.

Zie Gebruiken voor meer informatie over het ophalen, instellen en bijwerken van de toegangsbeheerlijsten (ACL) van mappen en bestanden. Java voor het beheren van ACL's in Azure Data Lake Storage Gen2.

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

Vereisten

Uw project instellen

Als u aan de slag wilt gaan, opent u deze pagina en zoekt u de nieuwste versie van de Java-bibliotheek. Open vervolgens het bestand pom.xml in de teksteditor. Voeg een afhankelijkheidselement toe dat verwijst naar die versie.

Als u van plan bent om uw clienttoepassing te verifiëren met behulp van Microsoft Entra ID, voegt u vervolgens een afhankelijkheid toe aan de Azure Identity-bibliotheek. Zie de Azure Identity-clientbibliotheek voor Java voor meer informatie.

Voeg vervolgens deze importinstructies toe aan uw codebestand.

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

Notitie

Met toegang tot meerdere protocollen in Data Lake Storage kunnen toepassingen zowel Blob-API's als Data Lake Storage Gen2-API's gebruiken om te werken met gegevens in opslagaccounts waarvoor HNS (hiërarchische naamruimte) is ingeschakeld. Wanneer u werkt met mogelijkheden die uniek zijn voor Data Lake Storage Gen2, zoals adreslijstbewerkingen en ACL's, gebruikt u de Data Lake Storage Gen2-API's, zoals wordt weergegeven in dit artikel.

Wanneer u kiest welke API's in een bepaald scenario moeten worden gebruikt, moet u rekening houden met de workload en de behoeften van uw toepassing, samen met de bekende problemen en impact van HNS op workloads en toepassingen.

Toegang autoriseren en verbinding maken met gegevensbronnen

Als u wilt werken met de codevoorbeelden in dit artikel, moet u een geautoriseerd DataLakeServiceClient-exemplaar maken dat het opslagaccount vertegenwoordigt. U kunt een DataLakeServiceClient object autoriseren met behulp van Microsoft Entra ID, een toegangssleutel voor een account of een Shared Access Signature (SAS).

U kunt de Azure Identity-clientbibliotheek voor Java gebruiken om uw toepassing te verifiëren met Microsoft Entra-id.

Maak een DataLakeServiceClient-exemplaar en geef een nieuw exemplaar van de klasse DefaultAzureCredential door .

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

Zie de Azure Identity-clientbibliotheek voor Java voor meer informatie over het gebruik DefaultAzureCredential van toegang tot gegevens.

Een container maken

Een container fungeert als een bestandssysteem voor uw bestanden. U kunt een container maken met behulp van de volgende methode:

In het volgende codevoorbeeld wordt een container gemaakt en wordt een DataLakeFileSystemClient-object geretourneerd voor later gebruik:

public DataLakeFileSystemClient CreateFileSystem(
        DataLakeServiceClient serviceClient,
        String fileSystemName) {

    DataLakeFileSystemClient fileSystemClient = serviceClient.createFileSystem(fileSystemName);

    return fileSystemClient;
}

Een map maken

U kunt een mapreferentie in de container maken met behulp van de volgende methode:

In het volgende codevoorbeeld wordt een map aan een container toegevoegd en vervolgens een submap toegevoegd en wordt een DataLakeDirectoryClient-object geretourneerd voor later gebruik:

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

    DataLakeDirectoryClient directoryClient = fileSystemClient.createDirectory(directoryName);

    return directoryClient.createSubdirectory(subDirectoryName);
}

De naam van een map wijzigen of verplaatsen

U kunt de naam van een map wijzigen of verplaatsen met behulp van de volgende methode:

Geef het pad van de gewenste map door als een parameter. In het volgende codevoorbeeld ziet u hoe u de naam van een submap wijzigt:

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

In het volgende codevoorbeeld ziet u hoe u een submap van de ene map naar een andere map verplaatst:

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

Een bestand uploaden naar een map

U kunt inhoud uploaden naar een nieuw of bestaand bestand met behulp van de volgende methode:

In het volgende codevoorbeeld ziet u hoe u een lokaal bestand uploadt naar een map met behulp van de uploadFromFile methode:

public void UploadFile(
        DataLakeDirectoryClient directoryClient,
        String fileName) {

    DataLakeFileClient fileClient = directoryClient.getFileClient(fileName);

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

U kunt deze methode gebruiken om inhoud te maken en te uploaden naar een nieuw bestand, of u kunt de overwrite parameter instellen om true een bestaand bestand te overschrijven.

Gegevens toevoegen aan een bestand

U kunt gegevens uploaden die aan een bestand moeten worden toegevoegd met behulp van de volgende methode:

In het volgende codevoorbeeld ziet u hoe u gegevens toevoegt aan het einde van een bestand met behulp van deze stappen:

  • Maak een DataLakeFileClient object dat de bestandsresource vertegenwoordigt waarmee u werkt.
  • Upload gegevens naar het bestand met behulp van de DataLakeFileClient.append methode.
  • Voltooi het uploaden door de DataLakeFileClient.flush methode aan te roepen om de eerder geüploade gegevens naar het bestand te schrijven.
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);
}

Downloaden uit een map

In het volgende codevoorbeeld ziet u hoe u een bestand downloadt van een map naar een lokaal bestand met behulp van deze stappen:

  • Maak een DataLakeFileClient object dat het bestand vertegenwoordigt dat u wilt downloaden.
  • Gebruik de DataLakeFileClient.readToFile methode om het bestand te lezen. In dit voorbeeld wordt de overwrite parameter ingesteld op true, waarmee een bestaand bestand wordt overschreven.
public void DownloadFile(
        DataLakeDirectoryClient directoryClient,
        String fileName) {

    DataLakeFileClient fileClient = directoryClient.getFileClient(fileName);

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

Mapinhoud weergeven

U kunt de inhoud van de map weergeven met behulp van de volgende methode en het resultaat opsommen:

Als u de paden in het resultaat opsommen, kunnen er meerdere aanvragen naar de service worden verzonden tijdens het ophalen van de waarden.

In het volgende codevoorbeeld worden de namen afgedrukt van elk bestand dat zich in een map bevindt:

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

}

Een directory verwijderen

U kunt een map verwijderen met behulp van een van de volgende methoden:

In het volgende codevoorbeeld wordt een deleteWithResponse lege map en alle paden onder de map verwijderd:

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

Zie ook