Använda Java för att hantera kataloger och filer i Azure Data Lake Storage Gen2

Den här artikeln visar hur du använder Java för att skapa och hantera kataloger och filer i lagringskonton som har ett hierarkiskt namnområde.

Mer information om hur du hämtar, anger och uppdaterar åtkomstkontrollistor (ACL) för kataloger och filer finns i Använda . Java för att hantera ACL:er i Azure Data Lake Storage Gen2.

Paket (Maven)Exempel-API-referens | | | Gen1 till Gen2-mappning | Ge feedback

Förutsättningar

Konfigurera projektet

Kom igång genom att öppna den här sidan och hitta den senaste versionen av Java-biblioteket. Öppna sedan filen pom.xml i textredigeraren. Lägg till ett beroendeelement som refererar till den versionen.

Om du planerar att autentisera klientprogrammet med hjälp av Microsoft Entra-ID lägger du till ett beroende i Azure Identity-biblioteket. Mer information finns i Azure Identity-klientbiblioteket för Java.

Lägg sedan till importinstruktionerna i kodfilen.

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

Kommentar

Med åtkomst med flera protokoll i Data Lake Storage kan program använda både Blob-API:er och Data Lake Storage Gen2-API:er för att arbeta med data i lagringskonton med hierarkisk namnrymd (HNS) aktiverad. När du arbetar med funktioner som är unika för Data Lake Storage Gen2, till exempel katalogåtgärder och ACL:er, använder du API:erna för Data Lake Storage Gen2, som du ser i den här artikeln.

När du väljer vilka API:er som ska användas i ett visst scenario bör du överväga arbetsbelastningen och programmets behov, tillsammans med de kända problemen och effekten av HNS på arbetsbelastningar och program.

Auktorisera åtkomst och ansluta till dataresurser

Om du vill arbeta med kodexemplen i den här artikeln måste du skapa en auktoriserad DataLakeServiceClient-instans som representerar lagringskontot. Du kan auktorisera ett DataLakeServiceClient objekt med hjälp av Microsoft Entra-ID, en kontoåtkomstnyckel eller en signatur för delad åtkomst (SAS).

Du kan använda Azure Identity-klientbiblioteket för Java för att autentisera ditt program med Microsoft Entra-ID.

Skapa en DataLakeServiceClient-instans och skicka in en ny instans av klassen 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;
}

Mer information om hur du använder DefaultAzureCredential för att auktorisera åtkomst till data finns i Azure Identity-klientbiblioteket för Java.

Skapa en container

En container fungerar som ett filsystem för dina filer. Du kan skapa en container med hjälp av följande metod:

I följande kodexempel skapas en container och ett DataLakeFileSystemClient-objekt returneras för senare användning:

public DataLakeFileSystemClient CreateFileSystem(
        DataLakeServiceClient serviceClient,
        String fileSystemName) {

    DataLakeFileSystemClient fileSystemClient = serviceClient.createFileSystem(fileSystemName);

    return fileSystemClient;
}

Skapa en katalog

Du kan skapa en katalogreferens i containern med hjälp av följande metod:

Följande kodexempel lägger till en katalog i en container, lägger sedan till en underkatalog och returnerar ett DataLakeDirectoryClient-objekt för senare användning:

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

    DataLakeDirectoryClient directoryClient = fileSystemClient.createDirectory(directoryName);

    return directoryClient.createSubdirectory(subDirectoryName);
}

Byta namn på eller flytta en katalog

Du kan byta namn på eller flytta en katalog med hjälp av följande metod:

Skicka sökvägen till den önskade katalogen som en parameter. I följande kodexempel visas hur du byter namn på en underkatalog:

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

I följande kodexempel visas hur du flyttar en underkatalog från en katalog till en annan katalog:

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

Ladda upp en fil till en katalog

Du kan ladda upp innehåll till en ny eller befintlig fil med hjälp av följande metod:

Följande kodexempel visar hur du laddar upp en lokal fil till en katalog med hjälp av uploadFromFile metoden:

public void UploadFile(
        DataLakeDirectoryClient directoryClient,
        String fileName) {

    DataLakeFileClient fileClient = directoryClient.getFileClient(fileName);

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

Du kan använda den här metoden för att skapa och ladda upp innehåll till en ny fil, eller så kan du ange parametern overwrite till true för att skriva över en befintlig fil.

Lägga till data i en fil

Du kan ladda upp data som ska läggas till i en fil med hjälp av följande metod:

Följande kodexempel visar hur du lägger till data i slutet av en fil med hjälp av följande steg:

  • Skapa ett DataLakeFileClient objekt som representerar den filresurs som du arbetar med.
  • Ladda upp data till filen med hjälp av DataLakeFileClient.append metoden .
  • Slutför uppladdningen genom att anropa DataLakeFileClient.flush metoden för att skriva tidigare uppladdade data till filen.
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);
}

Ladda ned från en katalog

Följande kodexempel visar hur du laddar ned en fil från en katalog till en lokal fil med hjälp av följande steg:

  • Skapa ett DataLakeFileClient objekt som representerar den fil som du vill ladda ned.
  • DataLakeFileClient.readToFile Använd metoden för att läsa filen. I det här exemplet anges parametern overwrite till true, som skriver över en befintlig fil.
public void DownloadFile(
        DataLakeDirectoryClient directoryClient,
        String fileName) {

    DataLakeFileClient fileClient = directoryClient.getFileClient(fileName);

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

Lista kataloginnehåll

Du kan visa kataloginnehåll med hjälp av följande metod och räkna upp resultatet:

Om du räknar upp sökvägarna i resultatet kan du göra flera begäranden till tjänsten när du hämtar värdena.

I följande kodexempel skrivs namnen på varje fil som finns i en katalog ut:

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

}

Ta bort en katalog

Du kan ta bort en katalog med någon av följande metoder:

I följande kodexempel används deleteWithResponse för att ta bort en icke-katalog och alla sökvägar under katalogen:

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

Se även