假设有一个HDFS集群,其中某个目录下有若干个文件(即文件个数可能不止一个),现需要通过Java程序读取该目录下所有文件的内容并打印到控制台上,请使用HDFS Java API完成此任务。
时间: 2023-12-14 17:38:55 浏览: 143
可以使用`FileSystem`类提供的方法来实现这个任务。具体步骤如下:
1. 获取`FileSystem`对象,可以通过`FileSystem.get()`方法来获取,默认会使用`core-site.xml`中配置的相关参数进行连接。
```java
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
```
2. 构建`Path`对象,指定要读取的目录路径。
```java
Path dirPath = new Path("/user/hdfs/dir");
```
3. 使用`FileSystem`对象的`listFiles()`方法获取目录下的所有文件,返回一个`FileStatus`数组。
```java
FileStatus[] fileStatuses = fs.listStatus(dirPath);
```
4. 遍历`FileStatus`数组,对每个文件构建`Path`对象,然后使用`FileSystem`对象的`open()`方法打开文件,获取`InputStream`对象,读取文件内容并打印到控制台上。
```java
for (FileStatus fileStatus : fileStatuses) {
if (fileStatus.isFile()) {
Path filePath = fileStatus.getPath();
FSDataInputStream inputStream = fs.open(filePath);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
inputStream.close();
}
}
```
完整代码如下:
```java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.Path;
public class HDFSReader {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
Path dirPath = new Path("/user/hdfs/dir");
FileStatus[] fileStatuses = fs.listStatus(dirPath);
for (FileStatus fileStatus : fileStatuses) {
if (fileStatus.isFile()) {
Path filePath = fileStatus.getPath();
FSDataInputStream inputStream = fs.open(filePath);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
inputStream.close();
}
}
fs.close();
}
}
```
注意,需要在运行程序之前,将`core-site.xml`和`hdfs-site.xml`等相关配置文件放在classpath下。
阅读全文