import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem; // 拥有open和create方法,分别用于读取和写入文件,其返回值分别为FSDataInputStream;和FSDataOutputStream;
import org.apache.hadoop.fs.Path; // 用于处理文件路径问题,PathFilter类还可以对文件进行过滤
import org.apache.hadoop.fs.FSDataInputStream; // 文件输入流,是读取文件后获得的输入流对象
public class ReadFile {
public static void main(String[] args) {
try {
Configuration conf = new Configuration(); //新建conf配置对象,用于配置文件系统中所有要使用的值
conf.set("fs.defaultFS","hdfs://localhost:9000"); // 设置默认的文件系统位置,本例中通过域名指定hdfs系统
conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem"); // 设置hdfs要实现的java类dfs
FileSystem fs = FileSystem.get(conf); // 将配置项传给FS类,连接到hdfs上
Path file = new Path("file1.txt"); // 创建要读取文件的路径,路径默认是在/user/hadoop下,即完整文件名为/user/hadoop/file1.txt
FSDataInputStream getIt = fs.open(file); //文件输入流,用于从hadoop中读取文件,用open方法打开这个文件
BufferedReader d = new BufferedReader(new InputStreamReader(getIt)); //创建输入缓冲流
String content = d.readLine(); //读取文件一行
System.out.println(content);
d.close(); //关闭文件
fs.close(); //关闭hdfs
} catch (Exception e) {
e.printStackTrace();
}
}
}
Path类的作用与 Node 中的 path 模块类似,都是用于合并多个目录结构的,比如 new Path(“a”,”b”) 其结果就是 a/b ,这一点和 path 模块的作用一摸一样。
并且 读取或者写入文件的方法 open 和 create 都要求必须传入一个类型为 Path 的对象,也就是说指定文件的时候必须用Path类来创建路径。