Java gebruiken om mappen en bestanden te beheren in Azure Data Lake Storage
In dit artikel leest u hoe u Java gebruikt om mappen en bestanden te maken en beheren in opslagaccounts met een hiërarchische naamruimte.
Package (Maven) | Samples | API reference | Gen1 to Gen2 mapping | Give Feedback
Vereisten
Een Azure-abonnement. Zie Gratis proefversie van Azure downloaden voor meer informatie.
Een opslagaccount waarvoor hiërarchische naamruimte is ingeschakeld. Volg deze instructies om er een te maken.
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 deoverwrite
parameter ingesteld optrue
, 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:
- DataLakeDirectoryClient.delete
- DataLakeDirectoryClient.deleteIfExists
- DataLakeDirectoryClient.deleteWithResponse
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);
}