Usar o Java para gerenciar diretórios e arquivos no Azure Data Lake Storage Gen2

Este artigo mostra como usar o Java para criar e gerenciar diretórios e arquivos nas contas de armazenamento que têm um namespace hierárquico.

Para saber mais sobre como obter, definir e atualizar as ACLs (listas de controle de acesso) de diretórios e arquivos, veja Usar o .Java para gerenciar as ACLs no Azure Data Lake Storage Gen2.

Pacote (Maven) | Exemplos | Referência de API | Mapeamento de Gen1 para Gen2 | Enviar comentários

Pré-requisitos

Configurar o seu projeto

Para começar, abra esta página e localize a versão mais recente da biblioteca do Java. Abra o arquivo pom.xml no editor de texto. Adicione um elemento de dependência que faz referência a essa versão.

Se você planejar autenticar o aplicativo cliente usando o Azure Active Directory (AAD), adicione uma dependência à biblioteca de cliente secretos do Azure. Veja Adicionar o pacote de biblioteca de clientes secretos ao projeto.

Em seguida, adicione essas instruções de importação ao arquivo de código.

import com.azure.storage.common.StorageSharedKeyCredential;
import com.azure.storage.file.datalake.DataLakeDirectoryClient;
import com.azure.storage.file.datalake.DataLakeFileClient;
import com.azure.storage.file.datalake.DataLakeFileSystemClient;
import com.azure.storage.file.datalake.DataLakeServiceClient;
import com.azure.storage.file.datalake.DataLakeServiceClientBuilder;
import com.azure.storage.file.datalake.models.ListPathsOptions;
import com.azure.storage.file.datalake.models.PathItem;
import com.azure.storage.file.datalake.models.AccessControlChangeCounters;
import com.azure.storage.file.datalake.models.AccessControlChangeResult;
import com.azure.storage.file.datalake.models.AccessControlType;
import com.azure.storage.file.datalake.models.PathAccessControl;
import com.azure.storage.file.datalake.models.PathAccessControlEntry;
import com.azure.storage.file.datalake.models.PathPermissions;
import com.azure.storage.file.datalake.models.PathRemoveAccessControlEntry;
import com.azure.storage.file.datalake.models.RolePermissions;
import com.azure.storage.file.datalake.options.PathSetAccessControlRecursiveOptions;

Conectar à conta

Para usar os trechos de código neste artigo, será necessário criar uma instância de DataLakeServiceClient que representa a conta de armazenamento.

Conectar-se usando uma chave de conta

Essa é a maneira mais fácil de se conectar a uma conta.

Este exemplo cria uma instância de DataLakeServiceClient usando uma chave de conta.

static public DataLakeServiceClient GetDataLakeServiceClient
(String accountName, String accountKey){

    StorageSharedKeyCredential sharedKeyCredential =
        new StorageSharedKeyCredential(accountName, accountKey);

    DataLakeServiceClientBuilder builder = new DataLakeServiceClientBuilder();

    builder.credential(sharedKeyCredential);
    builder.endpoint("https://" + accountName + ".dfs.core.windows.net");

    return builder.buildClient();
}

Conectar-se usando o Azure Active Directory (AAD)

É possível usar a Biblioteca de clientes de identidade do Azure para Java para autenticar o aplicativo com o AAD.

Este exemplo cria uma instância de DataLakeServiceClient usando uma ID do cliente, um segredo do cliente e uma ID de locatário. Para fazer isso, veja Adquirir um token do AAD para autorizar solicitações de um aplicativo cliente.

static public DataLakeServiceClient GetDataLakeServiceClient
    (String accountName, String clientId, String ClientSecret, String tenantID){

    String endpoint = "https://" + accountName + ".dfs.core.windows.net";
    
    ClientSecretCredential clientSecretCredential = new ClientSecretCredentialBuilder()
    .clientId(clientId)
    .clientSecret(ClientSecret)
    .tenantId(tenantID)
    .build();
       
    DataLakeServiceClientBuilder builder = new DataLakeServiceClientBuilder();
    return builder.credential(clientSecretCredential).endpoint(endpoint).buildClient();
}

Observação

Para obter mais exemplos, veja a documentação da Biblioteca de clientes de identidade do Azure para Java.

Criar um contêiner

Um contêiner atua como um sistema de arquivos para seus arquivos. Você pode criar um chamando o método DataLakeServiceClient.createFileSystem.

Este exemplo cria um contêiner chamado my-file-system.

public DataLakeFileSystemClient CreateFileSystem
(DataLakeServiceClient serviceClient){

    return serviceClient.createFileSystem("my-file-system");
}

Criar um diretório

Crie uma referência de diretório chamando o método DataLakeFileSystemClient.createDirectory.

Este exemplo adiciona um diretório chamado my-directory a um contêiner e, em seguida, adiciona um subdiretório chamado my-subdirectory.

public DataLakeDirectoryClient CreateDirectory
(DataLakeServiceClient serviceClient, String fileSystemName){

    DataLakeFileSystemClient fileSystemClient =
    serviceClient.getFileSystemClient(fileSystemName);

    DataLakeDirectoryClient directoryClient =
        fileSystemClient.createDirectory("my-directory");

    return directoryClient.createSubdirectory("my-subdirectory");
}

Renomear ou mover um diretório

Renomeie ou mova um diretório chamando o método DataLakeDirectoryClient.rename. Aprove o caminho do diretório desejado de um parâmetro.

Este exemplo renomeia um subdiretório para o nome my-subdirectory-renamed.

public DataLakeDirectoryClient
    RenameDirectory(DataLakeFileSystemClient fileSystemClient){

    DataLakeDirectoryClient directoryClient =
        fileSystemClient.getDirectoryClient("my-directory/my-subdirectory");

    return directoryClient.rename(fileSystemClient.getFileSystemName(),"my-subdirectory-renamed");
}

Este exemplo move um diretório chamado my-subdirectory-renamed para um subdiretório de um diretório chamado my-directory-2.

public DataLakeDirectoryClient MoveDirectory
(DataLakeFileSystemClient fileSystemClient){

    DataLakeDirectoryClient directoryClient =
        fileSystemClient.getDirectoryClient("my-directory/my-subdirectory-renamed");

    return directoryClient.rename(fileSystemClient.getFileSystemName(),"my-directory-2/my-subdirectory-renamed");                
}

Excluir um diretório

Exclua um diretório chamando o método DataLakeDirectoryClient.deleteWithResponse.

Este exemplo exclui um diretório chamado my-directory.

public void DeleteDirectory(DataLakeFileSystemClient fileSystemClient){
    
    DataLakeDirectoryClient directoryClient =
        fileSystemClient.getDirectoryClient("my-directory");

    directoryClient.deleteWithResponse(true, null, null, null);
}

Carregar um arquivo em um diretório

Primeiro, crie uma referência de arquivo no diretório de destino criando uma instância da classe DataLakeFileClient. Carregue um arquivo chamando o método DataLakeFileClient.append. Conclua o carregamento chamando o método DataLakeFileClient.FlushAsync.

Este exemplo carrega um arquivo de texto para um diretório chamado my-directory.

public void UploadFile(DataLakeFileSystemClient fileSystemClient) 
    throws FileNotFoundException{
    
    DataLakeDirectoryClient directoryClient =
        fileSystemClient.getDirectoryClient("my-directory");

    DataLakeFileClient fileClient = directoryClient.createFile("uploaded-file.txt");

    File file = new File("C:\\Users\\constoso\\mytestfile.txt");

 //   InputStream targetStream = new FileInputStream(file);
    InputStream targetStream = new BufferedInputStream(new FileInputStream(file));

    long fileSize = file.length();

    fileClient.append(targetStream, 0, fileSize);

    fileClient.flush(fileSize);
}

Dica

Se o tamanho do arquivo for grande, o código terá que fazer várias chamadas para o DataLakeFileClient.append. Considere usar o método DataLakeFileClient.uploadFromFile em vez disso. Dessa forma, você pode carregar o arquivo inteiro em uma única chamada.

Consulte a próxima seção para ver um exemplo.

Carregar um arquivo grande em um diretório

Use o método DataLakeFileClient.uploadFromFile para carregar arquivos grandes sem precisar fazer várias chamadas para o método DataLakeFileClient.append.

public void UploadFileBulk(DataLakeFileSystemClient fileSystemClient) 
    throws FileNotFoundException{
    
    DataLakeDirectoryClient directoryClient =
        fileSystemClient.getDirectoryClient("my-directory");

    DataLakeFileClient fileClient = directoryClient.getFileClient("uploaded-file.txt");

    fileClient.uploadFromFile("C:\\Users\\contoso\\mytestfile.txt");

}

Baixar de um diretório

Primeiro, crie uma instância de DataLakeFileClient que representa o arquivo que você deseja baixar. Use o método DataLakeFileClient.read para ler o arquivo. Use qualquer API de processamento de arquivo .NET para salvar bytes do fluxo para um arquivo.

public void DownloadFile(DataLakeFileSystemClient fileSystemClient)
  throws FileNotFoundException, java.io.IOException{

    DataLakeDirectoryClient directoryClient =
        fileSystemClient.getDirectoryClient("my-directory");

    DataLakeFileClient fileClient = 
        directoryClient.getFileClient("uploaded-file.txt");

    File file = new File("C:\\Users\\contoso\\downloadedFile.txt");

    OutputStream targetStream = new FileOutputStream(file);
    
    fileClient.read(targetStream);

    targetStream.close();

    fileClient.flush(file.length());
    
}

Listar conteúdo do diretório

Este exemplo, imprime os nomes de cada arquivo localizado em um diretório chamado my-directory.

public void ListFilesInDirectory(DataLakeFileSystemClient fileSystemClient){
    
    ListPathsOptions options = new ListPathsOptions();
    options.setPath("my-directory");
 
    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();
    }

}

Confira também