要从Hadoop文件系统中读取文件,一个最简单的方法是使用java.net.URL对象来打开一个数据流,从而从中读取数据。通常的格式以下:java
1. InputStream in = null; oop
2. try { spa
3. in = new URL("hdfs://host/path").openStream();.net
4. // process inorm
5. } finally { 对象
6. IOUtils.closeStream(in);hadoop
7. }get
这里还须要一点工做来让Java识别Hadoop文件系统的URL 方案,就是经过一个FsUrlStreamHandlerFactory实例来调用在URL中的setURLStreamHandler-Factory方法。这种方法在一个Java虚拟机中只能被调用一次,所以通常都在一个静态块中执行。这个限制意味着若是程序的其余部件(多是不在你控制中的第三方部件)设置一个URLStreamHandlerFactory,咱们便没法再从Hadoop中读取数据。下一节将讨论另外一种方法。虚拟机
例3-1展现了以标准输出显示Hadoop文件系统的文件的程序,它相似于Unix的cat命令。io
例3-1:用URLStreamHandler以标准输出格式显示Hadoop文件系统的文件
1. public class URLCat {
2.
3. static {
4. URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
5. }
6.
7. public static void main(String[] args) throws Exception {
8. InputStream in = null;
9. try {
10. in = new URL(args[0]).openStream();
11. IOUtils.copyBytes(in, System.out, 4096, false);
12. } finally {
13. IOUtils.closeStream(in);
14. }
15. }
16. }
咱们使用Hadoop中简洁的IOUtils类在finally子句中关闭数据流,同时复制输入流和输出流之间的字节(本例中是System.out)。copyBytes方法的最后两个参数,前者是要复制的缓冲的大小,后者表示复制结束后是否关闭数据流。这里是将输入流关掉了,而System.out不须要关闭。
下面是一个运行示例:
1. % hadoop URLCat hdfs://localhost/user/tom/quangle.txt
2. On the top of the Crumpetty Tree
3. The Quangle Wangle sat,
4. But his face you could not see,
5. On account of his Beaver Hat.