hadoop--hdfs基礎功能實現
阿新 • • 發佈:2018-12-28
package hadoop; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import org.apache.commons.io.IOUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.LocatedFileStatus; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.RemoteIterator; import org.junit.Before; import org.junit.Test; public class HdfsUtil { FileSystem fs = null; @Before public void init() throws IOException, InterruptedException, URISyntaxException{ //建立配置檔案物件 用來讀取classpath下的配置檔案 Configuration conf = new Configuration(); //由於沒有匯入配置檔案,此處使用set方法直接設定這個引數 conf.set("fs.dafaultFS", "hdfs://192.168.245.129:9000/"); //獲取一個具體檔案系統的客戶端的操作例項物件,指定URL和使用者名稱 ,在非hadoop伺服器中必須要指定hadoop伺服器的使用者名稱 fs = FileSystem.get(new URI("hdfs://192.168.245.129:9000/"), conf, "hadoop"); } //上傳檔案 @Test public void upload() throws IOException, InterruptedException, URISyntaxException{ //建立path物件。此處指定的是檔案上傳後存放的位置 Path path = new Path("/txt/122.txt"); //建立檔案寫入到伺服器的流 FSDataOutputStream os = fs.create(path); //建立本地的讀取檔案的流 FileInputStream is = new FileInputStream("c:/aaa.txt"); //呼叫工具類中的放大將本地的檔案寫入到遠端伺服器內 IOUtils.copy(is, os); } //使用fs裡面封裝的方法進行上傳 @Test public void uploadeasy() throws IllegalArgumentException, IOException{ //前面的引數是本地地址 後面引數是伺服器地址 本方法是直接將本地檔案複製到伺服器裡面去 // 即前面的是來源 後面的是目標 fs.copyFromLocalFile(new Path("c:/aaa.txt"), new Path("/txt/ghj/132.txt")); } //下載檔案 @Test public void download() throws IllegalArgumentException, IOException{ //fs.copyToLocalFile(new Path("/txt/132.txt"), new Path("f:/aa1.txt")) 使用該方法可能會出現 //空指標異常,可能原因是Windows上出現相容性問題,可以用一下方法代替 // 引數意義: 是否刪除源目錄 源地址 目標地址 是否使用本地檔案系統 fs.copyToLocalFile(false,new Path("/txt/132.txt"), new Path("f:/aa1.txt"),true); } //檢視檔案資訊 @Test public void listFile() throws FileNotFoundException, IllegalArgumentException, IOException{ //該方法只能檢視到目錄下的檔案的名稱,目錄名稱看不到 //引數 路徑 是否迴圈遍歷目錄裡面的檔案 RemoteIterator<LocatedFileStatus> files = fs.listFiles(new Path("/"), true); while (files.hasNext()) { LocatedFileStatus file = files.next(); Path filePath = file.getPath(); //通過path來獲取到檔案的名稱 String name = filePath.getName(); System.out.println(name); } System.out.println("==========================="); //該方法能看到當前目錄下的檔案和目錄 如果需要檢視目錄裡面的檔案,需要自己遞迴呼叫 FileStatus[] listStatus = fs.listStatus(new Path("/")); for (FileStatus status : listStatus) { Path path = status.getPath(); String name = path.getName(); System.out.println(name); } } //建立目錄 @Test public void mkdir() throws IllegalArgumentException, IOException{ fs.mkdirs(new Path("/bbb/ccc")); } //刪除目錄或檔案 @Test public void delete() throws IllegalArgumentException, IOException{ //刪除指定的目錄 //引數意義: 路徑 是否遞迴刪除裡面的內容 fs.delete(new Path("/text"), true); } }
記得需要匯入相應的jar包