使用FileSystem类进行文件读写及查看文件信息

发布时间:2017-2-28 3:11:10 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"使用FileSystem类进行文件读写及查看文件信息",主要涉及到使用FileSystem类进行文件读写及查看文件信息方面的内容,对于使用FileSystem类进行文件读写及查看文件信息感兴趣的同学可以参考一下。

使用FileSystem类进行文件读写及查看文件信息

 

  在这一节我们要深入了解Hadoop的FileSystem类——这是与与hadoop的文件系统交互的重要接口。虽然我们只是着重于HDFS的实现,但我们在编码时一般也要注意代码在FileSystem不同子类文件系统之间的可移植性。这是非常有用的,比如说你可以非常方便的直接用同样的代码在你的本地文件系统上进行测试。

使用hadoop URL读数据

  从hadoop文件系统中读取文件的最简单的方法之一便是使用java.net.URL对象来打开一个欲从中读取数据的流(stream)。通常情况下的编程风格如下:

复制代码
1 InputStream in = null;2 try {3     in = new URL("hdfs://host/path").openStream();4     //     process in5 } finally {6     IOUtils.closeStream(in);7 }
复制代码

  想要使java识别出hdfs开头的URL标示还需要一点其他的工作要做:通过URL的setURLStreamHandlerFactory()方法为java设置一个FSUrlStreamHandlerFactory。这个方法在每个JVM中只能调用一次,所以它通常会被放在一个static block中执行(如下所示),但如果你的某部分程序——例如一个你无法修改源代码的第三方组件——已经调用了这个方法,那你就不能通过URL来这样读取数据了(下一节我们会介绍另一种方法)。

复制代码
 1 public class URLCat { 2     static { 3       URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory()); 4     } 5      6     public static void main(String[] args) throws Exception{ 7       InputStream in = null; 8       try { 9           in = new URL(args[0]).openStream();10           IOUtils.copyBytes(in, System.out, 4096, false);11       } finally {12           // TODO: handle exception13           IOUtils.closeStream(in);14       }15     }16 }
复制代码

  上例中我们使用了Hadoop中的IOUtils类的两个静态方法:
  1)IOUtils.copyBytes(),其中in表示拷贝源,System.out表示拷贝目的地(也就是要拷贝到标准输出中去),4096表示用来拷贝的buffer大小,false表明拷贝完成后我们并不关闭拷贝源可拷贝目的地(因为System.out并不需要关闭,in可以在finally语句中被关闭)。
  2)IOUtils.closeStream(),用来关闭一个流。
  下面是我们的测试例子:

% hadoop URLCat hdfs://localhost/user/tom/quangle.txt
On the top of the Crumpetty Tree
The Quangle Wangle sat,
But his face you could not see,
On account of his Beaver Hat.

上一篇:Qt编写自定义控件插件路过的坑及注意事项
下一篇:Asp.Net MVC 中实现跨域访问

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。