使用 Java SDK 对 Azure Data Lake Storage Gen1 执行文件系统操作

了解如何使用 Azure Data Lake Storage Gen1 Java SDK 执行基本作,例如创建文件夹、上传和下载数据文件等。有关 Data Lake Storage Gen1 的详细信息,请参阅 Azure Data Lake Storage Gen1

可以在 Azure Data Lake Storage Gen1 Java API 文档中访问 Data Lake Storage Gen1 的 Java SDK API 文档

先决条件

  • Java 开发工具包 (JDK 7 或更高版本,使用 Java 版本 1.7 或更高版本)
  • Data Lake Storage Gen1 帐户。 请遵循通过 Azure 门户开始使用 Azure Data Lake Storage Gen1 中的说明进行操作。
  • Maven。 本教程使用 Maven 来构建项目及其依赖项。 尽管无需使用 Maven 或 Gradle 等生成系统即可生成,但这些系统可以更轻松地管理依赖项。
  • (可选)像 IntelliJ IDEAEclipse 等类似的 IDE。

创建 Java 应用程序

GitHub 上提供的代码示例 指导你完成在存储中创建文件、连接文件、下载文件以及删除存储中的某些文件的过程。 本文的这一部分将指导你完成代码的主要部分。

  1. 在命令行使用 mvn archetype 或通过 IDE 创建一个 Maven 项目。 有关如何使用 IntelliJ 创建 Java 项目的说明,请参阅此文。 有关如何使用 Eclipse 创建项目的说明,请参阅此文

  2. 将以下依赖项添加到 Maven pom.xml 文件。 在 </project> 标记前添加以下代码片段:

    <dependencies>
        <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-data-lake-store-sdk</artifactId>
        <version>2.1.5</version>
        </dependency>
        <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-nop</artifactId>
        <version>1.7.21</version>
        </dependency>
    </dependencies>
    

    第一个依赖项是使用 maven 存储库中的 Data Lake Storage Gen1 SDK(azure-data-lake-store-sdk)。 第二个依赖项是指定要用于此应用程序的日志记录框架(slf4j-nop)。 Data Lake Storage Gen1 SDK 使用 SLF4J 日志记录外观,它允许你从许多常用的日志记录框架中进行选择,例如 Log4j、Java 日志记录、Logback 等,或者没有日志记录。 本示例关闭日志记录功能,因此我们使用slf4j-nop绑定。 若要在应用中使用其他日志记录选项,请参阅 此处

  3. 将以下导入语句添加到应用程序。

    import com.microsoft.azure.datalake.store.ADLException;
    import com.microsoft.azure.datalake.store.ADLStoreClient;
    import com.microsoft.azure.datalake.store.DirectoryEntry;
    import com.microsoft.azure.datalake.store.IfExists;
    import com.microsoft.azure.datalake.store.oauth2.AccessTokenProvider;
    import com.microsoft.azure.datalake.store.oauth2.ClientCredsTokenProvider;
    
    import java.io.*;
    import java.util.Arrays;
    import java.util.List;
    

身份验证

创建 Data Lake Storage Gen1 客户端

创建 ADLStoreClient 对象需要指定 Data Lake Storage Gen1 帐户名称和使用 Data Lake Storage Gen1 进行身份验证时生成的令牌提供程序(请参阅 “身份验证 ”部分)。 Data Lake Storage Gen1 帐户名称必须是完全限定的域名。 例如,将 FILL-IN-HERE 替换为 mydatalakestoragegen1.azuredatalakestore.net 之类的内容。

private static String accountFQDN = "FILL-IN-HERE";  // full account FQDN, not just the account name
ADLStoreClient client = ADLStoreClient.createClient(accountFQDN, provider);

以下部分中的代码片段包含一些常见文件系统操作的示例。 可以查看 Data Lake Storage Gen1 Java SDK API 文档ADLStoreClient 对象的完整信息以查阅其他操作。

创建目录

以下代码片段在指定的 Data Lake Storage Gen1 帐户的根目录中创建目录结构。

// create directory
client.createDirectory("/a/b/w");
System.out.println("Directory created.");

创建文件

以下代码片段在目录结构中创建一个文件(c.txt),并将一些数据写入文件。

// create file and write some content
String filename = "/a/b/c.txt";
OutputStream stream = client.createFile(filename, IfExists.OVERWRITE  );
PrintStream out = new PrintStream(stream);
for (int i = 1; i <= 10; i++) {
    out.println("This is line #" + i);
    out.format("This is the same line (%d), but using formatted output. %n", i);
}
out.close();
System.out.println("File created.");

还可以使用字节数组创建文件(d.txt)。

// create file using byte arrays
stream = client.createFile("/a/b/d.txt", IfExists.OVERWRITE);
byte[] buf = getSampleContent();
stream.write(buf);
stream.close();
System.out.println("File created using byte array.");

上述代码片段中使用的函数的定义 getSampleContentGitHub 上作为示例的一部分提供。

追加到文件

以下代码片段将内容追加到现有文件。

// append to file
stream = client.getAppendStream(filename);
stream.write(getSampleContent());
stream.close();
System.out.println("File appended.");

上述代码片段中使用的函数的定义 getSampleContentGitHub 上作为示例的一部分提供。

读取文件

以下代码片段从 Data Lake Storage Gen1 帐户中的文件读取内容。

// Read File
InputStream in = client.getReadStream(filename);
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line;
while ( (line = reader.readLine()) != null) {
    System.out.println(line);
}
reader.close();
System.out.println();
System.out.println("File contents read.");

合并文件

以下代码片段连接 Data Lake Storage Gen1 帐户中的两个文件。 如果成功,连接文件将替换两个现有文件。

// concatenate the two files into one
List<String> fileList = Arrays.asList("/a/b/c.txt", "/a/b/d.txt");
client.concatenateFiles("/a/b/f.txt", fileList);
System.out.println("Two files concatenated into a new file.");

重命名文件

以下代码片段重命名 Data Lake Storage Gen1 帐户中的文件。

//rename the file
client.rename("/a/b/f.txt", "/a/b/g.txt");
System.out.println("New file renamed.");

获取文件的元数据

以下代码片段检索 Data Lake Storage Gen1 帐户中文件的元数据。

// get file metadata
DirectoryEntry ent = client.getDirectoryEntry(filename);
printDirectoryInfo(ent);
System.out.println("File metadata retrieved.");

设置对文件的权限

以下代码片段设置在上一节中创建的文件的权限。

// set file permission
client.setPermission(filename, "744");
System.out.println("File permission set.");

列出目录内容

以下代码片段以递归方式列出目录的内容。

// list directory contents
List<DirectoryEntry> list = client.enumerateDirectory("/a/b", 2000);
System.out.println("Directory listing for directory /a/b:");
for (DirectoryEntry entry : list) {
    printDirectoryInfo(entry);
}
System.out.println("Directory contents listed.");

上述代码片段中使用的函数的定义 printDirectoryInfoGitHub 上作为示例的一部分提供。

删除文件和文件夹

以下代码片段以递归方式删除 Data Lake Storage Gen1 帐户中的指定文件和文件夹。

// delete directory along with all the subdirectories and files in it
client.deleteRecursive("/a");
System.out.println("All files and folders deleted recursively");
promptEnterKey();

生成并运行应用程序

  1. 若要从 IDE 内部运行,请找到并按 “运行” 按钮。 若要从 Maven 运行,请使用 exec:exec
  2. 若要生成独立 jar,可以使用 Maven 程序集插件从命令行生成包含所有依赖项的 jar。 在 GitHub 上的示例源代码中,pom.xml 部分包含一个示例。

后续步骤