Gunakan Java untuk mengelola direktori dan file di Azure Data Lake Storage Gen2

Artikel ini menunjukkan cara menggunakan Java untuk membuat dan mengelola direktori dan file di akun penyimpanan yang memiliki namespace hierarkis.

Untuk mempelajari cara mendapatkan, mengatur, dan memperbarui daftar kontrol akses (ACL) direktori dan file, lihat Menggunakan Java untuk mengelola ACL di Azure Data Lake Storage Gen2.

Paket (Maven) | Sampel | Referensi API | Pemetaan Gen1 ke Gen2 | Beri Umpan Balik

Prasyarat

Menyiapkan proyek Anda

Untuk memulai, buka halaman ini dan temukan versi terbaru pustaka Java. Lalu, buka file pom.xml di editor teks Anda. Tambahkan elemen dependensi yang mereferensikan versi tersebut.

Jika Anda berencana mengautentikasi aplikasi klien menggunakan Microsoft Azure Active Directory (AD), maka tambahkan dependensi ke Pustaka Klien Rahasia Azure. Lihat Menambahkan paket Pustaka Klien Rahasia ke proyek Anda.

Selanjutnya, tambahkan pernyataan impor ini ke file kode Anda.

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;

Menyambungkan ke akun

Untuk menggunakan cuplikan dalam artikel ini, Anda harus membuat instance DataLakeServiceClient yang mewakili akun penyimpanan.

Sambungkan dengan menggunakan kunci akun

Ini adalah cara termudah untuk menyambungkan ke akun.

Contoh ini membuat instans DataLakeServiceClient dengan menggunakan kunci akun.

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

Menyambungkan dengan Microsoft Azure Active Directory (Microsoft Azure AD)

Anda dapat menggunakan pustaka klien identitas Azure untuk Java agar dapat mengotentikasi aplikasi Anda dengan Microsoft Azure AD.

Contoh ini membuat instans DataLakeServiceClient menggunakan ID klien, rahasia klien, dan ID penyewa. Untuk mendapatkan nilai ini, lihat Memperoleh token dari Microsoft Azure Active Directory untuk mengotorisasi permintaan dari aplikasi klien.

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

Catatan

Untuk contoh selengkapnya, lihat dokumentasi pustaka klien identitas Azure untuk Java.

Buat kontainer

Kontainer bertindak sebagai sistem file untuk file Anda. Anda dapat membuatnya dengan memanggil metode DataLakeServiceClient.createFileSystem.

Contoh ini membuat kontainer bernama my-file-system.

public DataLakeFileSystemClient CreateFileSystem
(DataLakeServiceClient serviceClient){

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

Buat direktori

Buat referensi direktori dengan memanggil metode DataLakeFileSystemClient.createDirectory.

Contoh ini menambahkan direktori bernama my-directory ke kontainer, lalu menambahkan sub-direktori bernama 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");
}

Ganti nama atau pindahkan direktori

Ganti nama atau pindahkan direktori dengan memanggil metode DataLakeDirectoryClient.rename. Berikan sebuah parameter ke jalur direktori yang diinginkan.

Contoh ini mengganti nama sub-direktori menjadi my-subdirectory-renamed.

public DataLakeDirectoryClient
    RenameDirectory(DataLakeFileSystemClient fileSystemClient){

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

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

Contoh ini memindahkan direktori yang dinamai my-subdirectory-renamed ke sub-direktori bernama 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");                
}

Menghapus direktori

Hapus direktori dengan memanggil metode DataLakeDirectoryClient.deleteWithResponse.

Contoh ini menghapus direktori bernama my-directory.

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

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

Mengunggah file ke direktori

Pertama, buat referensi file di direktori target dengan membuat instans kelas DataLakeFileClient. Unggah file dengan memanggil metode DataLakeFileClient.append. Pastikan untuk melengkapi unggahan dengan memanggil metode DataLakeFileClient.FlushAsync.

Contoh ini mengunggah file teks ke direktori bernama 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);
}

Tip

Jika ukuran file Anda besar, kode Anda harus melakukan beberapa panggilan ke metode DataLakeFileClient.append. Pertimbangkan untuk menggunakan metode DataLakeFileClient.uploadFromFile sebagai gantinya. Dengan demikian, Anda dapat mengunggah seluruh file dalam satu panggilan.

Lihat bagian berikutnya sebagai contoh.

Unggah file besar ke direktori

Gunakan metode DataLakeFileClient.uploadFromFile untuk mengunggah file besar tanpa harus melakukan beberapa panggilan ke metode 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");

}

Unduh dari direktori

Lalu, buat instans DataLakeFileClient yang mewakili file yang ingin Anda unduh. Gunakan metode DataLakeFileClient.read untuk membaca file. Gunakan API pemrosesan file .NET untuk menyimpan byte dari stream ke file.

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

Daftar isi direktori

Contoh ini, mencetak nama setiap file yang terletak di direktori bernama 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();
    }

}

Lihat juga