1、獲取HDFS對象的兩種方式:
方式1:
public static FileSystem initFileSystem1() throws IOException {
//獲取配置對象
Configuration conf = new Configuration();
//指定namenode地址
conf.set("fs.defaultFS", "hdfs://bigdata121:9000");
//獲取hdfs文件系統訪問對象
FileSystem client = FileSystem.get(conf);
return client;
}
方式2:
public static FileSystem initFileSystem2() throws IOException, URISyntaxException {
Configuration conf = new Configuration();
//直接通過uri的方式獲取hdfs文件系統訪問對象
FileSystem client = FileSystem.get(new URI("hdfs://bigdata121:9000"), conf);
return client;
}
后面都是通過client這個文件系統對象調用各個方法操作hdfs的。
2、configuration對象的參數值配置
//通過conf.set(key, value)的方式即可設置參數值,如
conf.set("fs.defaultFS", "hdfs://bigdata121:9000");
3、創建目錄
Path p = new Path(HDFS路徑);
client.mkdirs(p);
4、上傳文件
```;
Path dest = new Path(HDFS路徑);
Path src = new Path(本地路徑);
client.copyFromLocalFile(src, dest);
//還可以設置是否刪除本地文件,以及是否覆蓋hdfs中的原有同名文件
5、下載文件
//用法:
client.copyToLocalFile(srcPath,destPath,)
//例子:
Path downloadFile = new Path("/king/edit_new.xml");
Path destPath = new Path("G:\edits.xml");
client.copyToLocalFile(downloadFile, destPath);
client.close();
//還可以設置是否刪除hdfs中的源文件
6、刪除文件或者目錄
```java
/*方式1: client.delete(Path HDFS路徑,boolean 是否遞歸刪除)
如果不是遞歸刪除,那么在刪除的目錄的時候,如果目錄非空,那么就會報錯
*/
Path deletePath = new Path("/linux2.txt");
client.delete(deletePath, true);
client.close();
/*方式2: client.deleteOnExit(Path HDFS路徑)*/
Path deletePath = new Path("/linux2.txt");
client.deleteOnExit(deletePath); //存在裁刪除
client.close();
7、查看文件屬性(只能查看文件,不能查看目錄)
//返回的是一個LocatedFileStatus迭代器,用法:
RemoteIterator<LocatedFileStatus> pathList = client.listFiles(HDFS路徑, recursive);
recursive表示是否遞歸顯示子目錄下的內容
//例子:
public void listFileMetaData() throws Exception{
FileSystem client = initFileSystem2();
Path listPath = new Path("/");
//獲取指定路徑下列表,不遞歸顯示,返回一個迭代器
RemoteIterator<LocatedFileStatus> pathList = client.listFiles(listPath, false);
while (pathList.hasNext()) {
LocatedFileStatus i = pathList.next();
//獲取文件名
System.out.println(i.getPath().getName());
//文件權限
System.out.println(i.getPermission());
//文件屬主
System.out.println(i.getOwner());
//文件數組
System.out.println(i.getGroup());
//文件大小,單位Byte
System.out.println(i.getLen());
//文件的block的大小
System.out.println("blocksize:" + i.getBlockSize());
//獲取文件的block地址
BlockLocation[] bl = i.getBlockLocations();
for (BlockLocation b:bl) {
//獲取每個block 的偏移地址
System.out.println("offset:" + b.getOffset());
//獲取當前副本的block所在的所有datanode的主機名
String[] hosts = b.getHosts();
for (String h:hosts) {
System.out.println(h);
}
}
System.out.println("===========================");
}
8、查看文件和目錄的屬性
//返回的是一個FileStatus數組,無法遞歸顯示子目錄下的內容,但是能查看子目錄本身的屬性,用法
FileStatus[] f = client.listStatus(Path);
public void judgeFile() throws Exception{
FileSystem client = initFileSystem2();
Path path = new Path("/");
//獲取FileSstatus對象
FileStatus[] fileStatuses = client.listStatus(path);
//通過Filestatus對象獲取文件或者目錄的屬性
for (FileStatus f:fileStatuses) {
System.out.println("文件名:" + f.getPath().getName());
System.out.println("權限:" + f.getPermission());
System.out.println("大小:" + f.getLen());
System.out.println("==========================");
}
client.close();
}
9、文件類型判斷
//通過上面的FileStatus和LocatedFileStatus 都可以調用內部的方法判斷當前是文件還是目錄
FileStatus對象.isFile()
LocatedFileStatus對象.isFile()
FileStatus對象.isDirectory()
LocatedFileStatus對象.isDirectory()
1、以IO流方式上傳文件
主要用到的是下面兩個方法:
//這是HDFS專用的數據流輸出流
FSDataOutputStream fos = client.create(Path)
//create方法還有以下參數:
boolean overwrite:如果文件文件已存在,是否覆蓋,默認是true
short replication:可以指定副本數,不指定就以hdfs的配置為準
int bufferSize:緩沖區大小
long blockSize:指定自己使用的塊大小
FsPermission var2:指定權限
ChecksumOpt checksumOpt:指定校驗值
//下面是對接輸入流和輸出流的工具
IOutils.copyBytes(inputstream,outputstream,buffsize,close)
inputstream 輸入流
outputstream 輸出流
buffsize 緩沖區
close 是否關閉流
例子:
@Test
public void putFileFromIO() throws Exception {
FileSystem client = initFileSystem2();
//創建本地文件字節輸入流
InputStream fis = new FileInputStream("E:\\file\\big data\\java se\\第十八章 Java文件與IO流.md");
//創建hdfs文件字節輸出流,注意,創建輸出流文件的時候,一定要指定文件名,否則會報錯
Path uploadPath = new Path("/第十八章 Java文件與IO流.md");
FSDataOutputStream fos = client.create(uploadPath);
//輸入流和輸出流對接
try {
//輸入流和輸出流拷貝,后面false表示不關閉流
IOUtils.copyBytes(fis, fos, 1024,false);
} catch (IOException e) {
e.printStackTrace();
} finally {
//關閉輸入流和輸出流
IOUtils.closeStream(fis);
IOUtils.closeStream(fos);
}
}
2、以IO流方式下載文件
Path getPath = new Path("/dog.txt");
FSDataInputStream fis = client.open(getPath);
例子:
/*
* 寫入有兩種方式:
* 1、使用流的read/write方法
* 2、使用IOUtils.copyBytes(instream,outstream,buffize)這個工具
* */
@Test
public void getFileFromIO() throws Exception{
FileSystem client = initFileSystem2();
//創建本地輸出流,保存內容
OutputStream fos = new FileOutputStream("F:\\edit_new.xml");
//創建hdfs輸入流
Path getPath = new Path("/dog.txt");
FSDataInputStream fis = client.open(getPath);
try {
IOUtils.copyBytes(fis, System.out, 1024);
} catch (IOException e) {
e.printStackTrace();
} finally {
IOUtils.closeStream(fis);
IOUtils.closeStream(fos);
}
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。