import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.URL;
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;
import org.junit.Test;
public class TestFileSystemURL {
static {
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
}
/**
* 通過URL對象讀取HDFS文件數據
*
* @author Administrator
*
* 想要從HDFS中讀取數據,首先我們考慮的是從WEBUI的那種方式去取出數據
* 1.定義一個URL對象,該URL對象封裝了該HDFS的URL地址信息
* 2.調用openStream()方法打開一個輸入流
* 3.通過IOUtils工具類把輸入流複製到字節數組輸出流中,然後打印輸出字節輸出流的信息
*
*/
@Test
public void readByURL() throws Exception {
// 配置需要讀取的URL地址的文件
String urlStr = "hdfs://hadoop01:9000/user/hadoop/data/hello.txt";
// 通過URL的帶string的構造方法來創建URL對象
URL url = new URL(urlStr);
// 調用URL對象的openStream()方法得到一個inputstream對象
InputStream is = url.openStream();
//定義一個字符數組
// byte[] bys = new byte[1024];
// int len =0;
//有三部,讀取,賦值,判斷,一次讀取一個字符數組,返回值是讀取的字符數組的長度,如果已經到
//文件的末尾了,就返回-1
// while((len=is.read(bys))!=-1){
//輸出一個字符數組,準確的說是輸出字符數組的一部分,從0開始到讀取的長度結束,print後面不加
//ln
// System.out.print(new String(bys,0,len));
// }
// 創建字節數組輸出流對象
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// hadoop提供的IOUtils方法來實現流的對拷
IOUtils.copyBytes(is, baos, 1024);
// 關閉流對象
IOUtils.closeStream(is);
System.out.println(new String(baos.toByteArray()));
}
}