要從Hadoop文件系統中讀取文件,一個最簡單的方法是使用java.net.URL對象來打開一個數據流,從而從中讀取數據。通常的格式以下:
1. InputStream in = null;
2. try {
3. in = new URL("hdfs://host/path").openStream();
4. // process in
5. } finally {
6. IOUtils.closeStream(in);
7. }
這裏還須要一點工做來讓Java識別Hadoop文件系統的URL 方案,就是經過一個FsUrlStreamHandlerFactory實例來調用在URL中的setURLStreamHandler-Factory方法。這種方法在一個Java虛擬機中只能被調用一次,所以通常都在一個靜態塊中執行。這個限制意味着若是程序的其餘部件(多是不在你控制中的第三方部件)設置一個URLStreamHandlerFactory,咱們便沒法再從Hadoop中讀取數據。下一節將討論另外一種方法。
例3-1展現了以標準輸出顯示Hadoop文件系統的文件的程序,它相似於Unix的cat命令。
例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不須要關閉。java
瞭解更多詳情請登陸超人學院網站http://www.crxy.cn?sxy或者關注超人學院微信號:CRXY-CN微信