要從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.