在 hadoop 的 HDFS 操做中,有個很是重要的 api,是 org.apache.hadoop.fs.FileSystem,
這是咱們用戶代碼操做 HDFS 的直接入口,該類含有操做 HDFS 的各類方法,相似於 jdbc 中
操做數據庫的直接入口是 Connection 類。
那咱們怎麼得到一個 FileSystem 對象哪?java
String uri = "hdfs://192.168.1.240:9000/";
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(URI.create(uri), configuration);
以上代碼中,要注意調用的是 FileSystem 的靜態方法 get,傳遞兩個值給形式參數,第
一個訪問的 HDFS 地址,該地址的協議是 hdfs,ip 是 192.168.1.240,端口是 9000.。這個地
址的完整信息是在配置文件 core-site.xml 中指定的,讀者可使用本身環境的配置文件中的
設置。第二個參數是一個配置對象。shell
使用 HDFS 的 shell 命令查看一下根目錄下的文件狀況,如圖1所示。
圖1
咱們在 HDFS 的根目錄下建立文件夾,代碼以下數據庫
final String pathString = "/d1";
boolean exists = fs.exists(new Path(pathString));
if(!exists){
boolean result = fs.mkdirs(new Path(pathString));
System.out.println(result);
}
以上代碼中,咱們決定建立的文件夾完整路徑是「/d1」 。第二行代碼是使用方法 exitst
判斷文件夾是否存在;若是不存在,執行建立操做。建立文件夾,調用的是 mkdirs 方法,
返回值是布爾值,若是是 true,表示建立成功;若是是 false,表示建立失敗。
如今查看一下是否成功了,如圖2,可見建立成功了。
圖2apache
咱們能夠向 HDFS 寫入文件,代碼以下:api
final String pathString = "/d1/f1";
final FSDataOutputStream fsDataOutputStream = fs.create(new Path(pathString));
IOUtils.copyBytes(new ByteArrayInputStream("my name is ## ##".getBytes()),
fsDataOutputStream, configuration, true);
第一行代碼表示建立的文件是在剛纔建立的 d1 文件夾下的文件 f1;
第二行是調用 create 方法建立一個通向 HDFS 的輸出流;
第三行是經過調用 hadoop 的一個工具類 IOUtils 的靜態方法 copyBytes 把一個字符串發
送給輸出流中。該靜態方法有四個參數,第一個參數輸入流,第二個參數是輸出流,第三個
參數是配置對象,第四個參數是布爾值,若是是 true 表示數據傳輸完畢後關閉流。
如今看一下是否建立成功了,如圖3所示。
圖 3markdown
如今咱們把剛纔寫入到 HDFS 的文件「/d1/f1」讀出來,代碼以下:
final String pathString = 「/d1/f1」;
final FSDataInputStream fsDataInputStream = fs.open(new Path(pathString));
IOUtils.copyBytes(fsDataInputStream, System.out, configuration, true);
第二行表示調用方法 open 打開一個指定的文件,返回值是一個通向該文件的輸入流;
第三行仍是調用 IOUtils.copyBytes 方法,輸出的目的地是控制檯。見圖 4
圖4工具
咱們能夠把根目錄下的全部文件和目錄顯示出來,代碼以下:oop
final String pathString = "/";
final FileStatus[] listStatus = fs.listStatus(new Path(pathString));
for (FileStatus fileStatus : listStatus) {
final String type = fileStatus.isDir()?"目錄":"文件";
final short replication = fileStatus.getReplication();
final String permission = fileStatus.getPermission().toString();
final long len = fileStatus.getLen();
final Path path = fileStatus.getPath();
System.out.println(type+"\t"+permission+"\t"+replication+"\t"+len+"\t"+path);
}
調用listStatus方法會獲得一個指定路徑下的全部文件和文件夾,每個用FileStatus表示。我
們使用for循環顯示每個FileStatus對象。FileStatus對象表示文件的詳細信息,裏面含有類型、
副本數、權限、長度、路徑等不少信息,咱們只是顯示了一部分。結果如圖5所示。
圖5ui
咱們能夠刪除某個文件或者路徑,代碼以下spa
final String pathString = "/d1/f1";
//fs.delete(new Path("/d1"), true);
fs.deleteOnExit(new Path(pathString));
第三行代碼表示刪除文件「/d1/f1」 ,註釋掉的第二行代碼表示遞歸刪除目錄「/d1」及 下面的全部內容。 除了上面列出的 fs 的方法外,還有不少方法,請讀者本身查閱 api。