استخدام Java لإدارة الدلائل والملفات في Azure Data Lake Storage Gen2

توضح لك هذه المقالة كيفية استخدام Java لإنشاء الدلائل والملفات وإدارتها في حسابات التخزين التي تحتوي على مساحة أسماء هرمية.

للتعرف على كيفية الحصول على قوائم التحكم في الوصول (ACL) للدلائل والملفات وتعيينها وتحديثها، راجع استخدام . Java لإدارة قوائم التحكم بالوصول في Azure Data Lake Storage Gen2.

حزمة | عينات | مرجع واجهة برمجة التطبيقات | الجيل الأول لرسم خرائط الجيل الثاني | تقديم الملاحظات

المتطلبات الأساسية

إعداد مشروعك

للبدء، افتح هذه الصفحة وابحث عن أحدث إصدار من مكتبة Java. افتح الملف pom.xml في محرر النصوص خاصتك. إضافة عنصر تبعية يشير إلى هذا الإصدار.

إذا كنت تخطط لمصادقة تطبيق العميل الخاص بك باستخدام معرف Microsoft Entra، فأضف تبعية إلى مكتبة Azure Identity. لمزيد من المعلومات، راجع مكتبة عميل Azure Identity ل Java.

بعد ذلك، أضف عبارات الاستيراد هذه إلى ملف التعليمات البرمجية.

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

إشعار

يتيح الوصول متعدد البروتوكولات على Data Lake Storage للتطبيقات استخدام كل من واجهات برمجة تطبيقات Blob وواجهات برمجة تطبيقات Data Lake Storage Gen2 للعمل مع البيانات في حسابات التخزين مع تمكين مساحة الاسم الهرمية (HNS). عند العمل مع قدرات فريدة من نوعها ل Data Lake Storage Gen2، مثل عمليات الدليل و ACLs، استخدم واجهات برمجة تطبيقات Data Lake Storage Gen2، كما هو موضح في هذه المقالة.

عند اختيار واجهات برمجة التطبيقات التي يجب استخدامها في سيناريو معين، ضع في اعتبارك حمل العمل واحتياجات التطبيق الخاص بك، بالإضافة إلى المشكلاتالمعروفة وتأثير HNS على أحمال العمل والتطبيقات.

تخويل الوصول إلى موارد البيانات والاتصال بها

للعمل مع أمثلة التعليمات البرمجية في هذه المقالة، تحتاج إلى إنشاء مثيل DataLakeServiceClient معتمد يمثل حساب التخزين. يمكنك تخويل كائن DataLakeServiceClient باستخدام معرف Microsoft Entra أو مفتاح الوصول إلى الحساب أو توقيع وصول مشترك (SAS).

يمكنك استخدام مكتبة عميل هوية Azure ل Java لمصادقة التطبيق الخاص بك باستخدام معرف Microsoft Entra.

إنشاء مثيل DataLakeServiceClient وتمرير مثيل جديد من فئة 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;
}

لمعرفة المزيد حول استخدام DefaultAzureCredential لتخويل الوصول إلى البيانات، راجع مكتبة عميل Azure Identity ل Java.

إنشاء حاوية

تعمل الحاوية كنظام ملفات لملفاتك. يمكنك إنشاء حاوية باستخدام الأسلوب التالي:

ينشئ مثال التعليمات البرمجية التالي حاوية ويعيد كائن DataLakeFileSystemClient للاستخدام لاحقا:

public DataLakeFileSystemClient CreateFileSystem(
        DataLakeServiceClient serviceClient,
        String fileSystemName) {

    DataLakeFileSystemClient fileSystemClient = serviceClient.createFileSystem(fileSystemName);

    return fileSystemClient;
}

إنشاء دليل

يمكنك إنشاء مرجع دليل في الحاوية باستخدام الأسلوب التالي:

يضيف مثال التعليمات البرمجية التالي دليلا إلى حاوية، ثم يضيف دليلا فرعيا ويعيد كائن DataLakeDirectoryClient لاستخدامه لاحقا:

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

    DataLakeDirectoryClient directoryClient = fileSystemClient.createDirectory(directoryName);

    return directoryClient.createSubdirectory(subDirectoryName);
}

إعادة تسمية دليل أو نقله

يمكنك إعادة تسمية دليل أو نقله باستخدام الأسلوب التالي:

قم بتمرير مسار الدليل المطلوب كمعلمة. يوضح مثال التعليمات البرمجية التالي كيفية إعادة تسمية دليل فرعي:

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

يوضح مثال التعليمات البرمجية التالي كيفية نقل دليل فرعي من دليل واحد إلى دليل مختلف:

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

تحميل ملف إلى دليل

يمكنك تحميل المحتوى إلى ملف جديد أو موجود باستخدام الأسلوب التالي:

يوضح مثال التعليمات البرمجية التالي كيفية تحميل ملف محلي إلى دليل باستخدام uploadFromFile الأسلوب :

public void UploadFile(
        DataLakeDirectoryClient directoryClient,
        String fileName) {

    DataLakeFileClient fileClient = directoryClient.getFileClient(fileName);

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

يمكنك استخدام هذا الأسلوب لإنشاء محتوى وتحميله إلى ملف جديد، أو يمكنك تعيين المعلمة overwrite للكتابة true فوق ملف موجود.

إلحاق البيانات بالملف

يمكنك تحميل البيانات ليتم إلحاقها بملف باستخدام الأسلوب التالي:

يوضح مثال التعليمات البرمجية التالي كيفية إلحاق البيانات بنهاية ملف باستخدام الخطوات التالية:

  • إنشاء كائن DataLakeFileClient لتمثيل مورد الملف الذي تعمل معه.
  • تحميل البيانات إلى الملف باستخدام DataLakeFileClient.append الأسلوب .
  • أكمل التحميل عن طريق استدعاء DataLakeFileClient.flush الأسلوب لكتابة البيانات التي تم تحميلها مسبقا إلى الملف.
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);
}

تنزيل من دليل

يوضح مثال التعليمات البرمجية التالي كيفية تنزيل ملف من دليل إلى ملف محلي باستخدام الخطوات التالية:

  • إنشاء كائن DataLakeFileClient لتمثيل الملف الذي تريد تنزيله.
  • DataLakeFileClient.readToFile استخدم الأسلوب لقراءة الملف. يعين هذا المثال المعلمة overwrite إلى true، التي تقوم بالكتابة فوق ملف موجود.
public void DownloadFile(
        DataLakeDirectoryClient directoryClient,
        String fileName) {

    DataLakeFileClient fileClient = directoryClient.getFileClient(fileName);

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

إعداد قائمة محتويات الدليل

يمكنك سرد محتويات الدليل باستخدام الأسلوب التالي وتعداد النتيجة:

قد يؤدي تعداد المسارات في النتيجة إلى تقديم طلبات متعددة إلى الخدمة أثناء إحضار القيم.

يطبع مثال التعليمات البرمجية التالي أسماء كل ملف موجود في دليل:

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

}

حذف دليل

يمكنك حذف دليل باستخدام إحدى الطرق التالية:

يستخدم deleteWithResponse مثال التعليمات البرمجية التالي لحذف دليل nonempty وجميع المسارات أسفل الدليل:

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

(راجع أيضًا )