package step3; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.io.File; … public static void main(String[] args) throws IOException { //请在 Begin-End 之间添加代码,完成任务要求。 /********* Begin *********/ /********* End *********/ } } 根据这个要求写代码
时间: 2025-06-19 21:56:20 浏览: 17
好的,根据你提供的代码框架,我将完成以下任务:
1. **创建本地文件 `hello.txt` 并写入指定内容**。
2. **使用 `FSDataOutputStream` 对象将文件上传至 HDFS 的 `/user/tmp/` 目录下,并打印进度**。
以下是完整的代码实现:
```java
package step3;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.util.Progressable;
import java.io.*;
public class HdfsUploadExample {
public static void main(String[] args) throws IOException {
// 请在 Begin-End 之间添加代码,完成任务要求。
/********* Begin *********/
String localFilePath = "/develop/input/hello.txt";
String hdfsFilePath = "/user/tmp/hello.txt";
// 创建本地文件并写入内容
createLocalFile(localFilePath);
// 上传文件到HDFS
uploadToHDFS(localFilePath, hdfsFilePath);
System.out.println("\n文件上传成功!");
/********* End *********/
}
// 写入本地文件
private static void createLocalFile(String localFilePath) throws IOException {
File file = new File(localFilePath);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
writer.write("迢迢牵牛星,皎皎河汉女。\n");
writer.write("纤纤擢素手,札札弄机杼。\n");
writer.write("终日不成章,泣涕零如雨。\n");
writer.write("河汉清且浅,相去复几许?\n");
writer.write("盈盈一水间,脉脉不得语。\n");
writer.write("《迢迢牵牛星》");
}
}
// 上传文件到HDFS
private static void uploadToHDFS(String localFilePath, String hdfsFilePath) throws Exception {
// 配置HDFS
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://<namenode-host>:8020"); // 替换为你的HDFS NameNode地址
FileSystem fs = FileSystem.get(URI.create(hdfsFilePath), conf);
// 检查HDFS目标路径是否存在,存在则删除
Path path = new Path(hdfsFilePath);
if (fs.exists(path)) {
fs.delete(path, true);
}
// 创建HDFS文件
try (FSDataOutputStream out = fs.create(path, new Progressable() {
@Override
public void progress() {
System.out.print(".");
}
});
FileInputStream in = new FileInputStream(localFilePath)) {
byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = in.read(buffer)) > 0) {
out.write(buffer, 0, bytesRead);
}
} finally {
if (fs != null) {
fs.close();
}
}
}
}
```
### 代码解析
1. **创建本地文件 (`createLocalFile` 方法)**:
- 使用 `BufferedWriter` 将给定的文本内容写入到本地文件 `hello.txt` 中。
- 如果文件所在的目录不存在,则先创建目录。
2. **上传文件到HDFS (`uploadToHDFS` 方法)**:
- 使用 `Configuration` 配置HDFS的连接信息。
- 获取 `FileSystem` 实例,指定HDFS的目标路径。
- 如果目标路径已存在,则先删除旧文件。
- 使用 `FSDataOutputStream` 创建新文件,并通过 `Progressable` 接口监控上传进度。
- 从本地文件读取内容并写入到HDFS中,每次写入后调用 `progress()` 方法打印进度符号 `.`。
3. **主方法 (`main` 方法)**:
- 在 `Begin-End` 标签之间调用 `createLocalFile` 创建本地文件。
- 调用 `uploadToHDFS` 上传文件到HDFS。
- 成功上传后打印提示信息。
### 注意事项
- 请确保替换代码中的 `<namenode-host>` 为实际的HDFS NameNode地址。
- 代码中的路径和文件名可以根据实际情况调整。
- 上传过程中会打印进度符号 `.`,表示上传进度。
阅读全文
相关推荐



















