实验内容使用Hadoop提供的Shell命令实现:
实验内容使用Java 编程实现:
实验题三
题目
一般我们使用FileSystem来读取hdfs上的文件,但这次我们换一种方法:
(三)查看Java帮助手册或其它资料,用“java.net.URL”和“org.apache.hadoop.fs.FsURLStreamHandlerFactory”编程完成输出HDFS中指定文件的文本到终端中。
分析:
URL表示网络地址,我们知道hadoop可以通过hdfs://localhost:9000的方式连接节点访问,所以我们需要通过网络模块的URL类来访问这个地址,请求一个输入流。
FsURLStreamHandlerFactory介绍
https://hadoop.apache.org/docs/r1.2.1/api/org/apache/hadoop/fs/FsUrlStreamHandlerFactory.html
核心方法:
createURLStreamHandler(String protocol):URLStreamHandler
其中的URLStreamHandler是专门用于处理URL请求流的,也是构造URL对象可选的参数之一。
java.net.URL介绍
https://blog.csdn.net/qq_27870421/article/details/90110773
观察其中一个构造方法,发现正好有用到createURLStreamHandler方法返回的 URLStreamHandler对象
URL(String protocol, String host, int port, String file, URLStreamHandler handler) | URL根据指定的协议,主机,端口(整形),文件地址和URL流处理对象来创建对象 。 |
---|---|
核心方法:openStream()
InputStream openStream() | 打开此连接URL并返回一个 InputStream 以从该连接读取。 |
---|---|
实现步骤
- 通过 FsURLStreamHandlerFactory.createURLStreamHandler(String protocol) 获取一个 URLStreamHandler 对象,然后传入URL类,并用 URL.openStream() 方法访问该文件并获得一个输入流。
- 获取输入流后,可以通过 InputStreamReader(InputStream in)类 和 BufferedReader(Reader r)类读取内容
- 通过循环 readLine() 输出所有内容即可。 ```java package HomeWork;
import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.net.URLStreamHandler; import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
public class Test3 { public static void main(String[] args) { try { // 1.通过 FsURLStreamHandlerFactory.createURLStreamHandler(String protocol) 获取一个 URLStreamHandler 对象, FsUrlStreamHandlerFactory fs = new FsUrlStreamHandlerFactory(); URLStreamHandler us = fs.createURLStreamHandler(“hdfs”);
// 2.传入URL类,并用 URL.openStream() 方法访问该文件并获得一个输入流。
// URL构造参数:协议,主机,端口,文件,URLStreamHandler对象
// new URL(protocol, host, port, file, handler)
URL url = new URL("hdfs", "localhost", 9000, "/user/hadoop/file1.txt", us); // 实际地址为:hdfs://localhost:9000/user/hadoop/file1.txt
InputStream in = url.openStream();
// 3.获取输入流后,可以通过 InputStreamReader(InputStream in)类 和 BufferedReader(Reader r)类读取内容
InputStreamReader ir = new InputStreamReader(in);
BuffredReader br = new BufferedReader(ir);
// 2、3步可简化为:
// BufferedReader br = new BufferedReader(new InputStreamReader(new URL("hdfs", "localhost", 9000, "/user/hadoop/file1.txt", us).openStream()));
// 4.通过循环 readLine() 输出所有内容即可。
String contetn;
while((contetn = br.readLine()) != null){
System.out.println(contetn);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
```