实验内容使用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 以从该连接读取。

获取该URL地址所映射的文件,并打开一个可以读取的输入流。

实现步骤

  1. 通过 FsURLStreamHandlerFactory.createURLStreamHandler(String protocol) 获取一个 URLStreamHandler 对象,然后传入URL类,并用 URL.openStream() 方法访问该文件并获得一个输入流。
  2. 获取输入流后,可以通过 InputStreamReader(InputStream in)类 和 BufferedReader(Reader r)类读取内容
  3. 通过循环 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”);

  1. // 2.传入URL类,并用 URL.openStream() 方法访问该文件并获得一个输入流。
  2. // URL构造参数:协议,主机,端口,文件,URLStreamHandler对象
  3. // new URL(protocol, host, port, file, handler)
  4. URL url = new URL("hdfs", "localhost", 9000, "/user/hadoop/file1.txt", us); // 实际地址为:hdfs://localhost:9000/user/hadoop/file1.txt
  5. InputStream in = url.openStream();
  6. // 3.获取输入流后,可以通过 InputStreamReader(InputStream in)类 和 BufferedReader(Reader r)类读取内容
  7. InputStreamReader ir = new InputStreamReader(in);
  8. BuffredReader br = new BufferedReader(ir);
  9. // 2、3步可简化为:
  10. // BufferedReader br = new BufferedReader(new InputStreamReader(new URL("hdfs", "localhost", 9000, "/user/hadoop/file1.txt", us).openStream()));
  11. // 4.通过循环 readLine() 输出所有内容即可。
  12. String contetn;
  13. while((contetn = br.readLine()) != null){
  14. System.out.println(contetn);
  15. }
  16. } catch (Exception e) {
  17. e.printStackTrace();
  18. }
  19. }

}

```