您好,登錄后才能下訂單哦!
1、獲取HDFS對象的兩種方式:
方式1:
public static FileSystem initFileSystem1() throws IOException {
//獲取配置對象
Configuration conf = new Configuration();
//指定namenode地址
conf.set("fs.defaultFS", "hdfs://bigdata121:9000");
//獲取hdfs文件系統(tǒng)訪問對象
FileSystem client = FileSystem.get(conf);
return client;
}
方式2:
public static FileSystem initFileSystem2() throws IOException, URISyntaxException {
Configuration conf = new Configuration();
//直接通過uri的方式獲取hdfs文件系統(tǒng)訪問對象
FileSystem client = FileSystem.get(new URI("hdfs://bigdata121:9000"), conf);
return client;
}
后面都是通過client這個文件系統(tǒng)對象調(diào)用各個方法操作hdfs的。
2、configuration對象的參數(shù)值配置
//通過conf.set(key, value)的方式即可設(shè)置參數(shù)值,如
conf.set("fs.defaultFS", "hdfs://bigdata121:9000");
3、創(chuàng)建目錄
Path p = new Path(HDFS路徑);
client.mkdirs(p);
4、上傳文件
```;
Path dest = new Path(HDFS路徑);
Path src = new Path(本地路徑);
client.copyFromLocalFile(src, dest);
//還可以設(shè)置是否刪除本地文件,以及是否覆蓋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();
//還可以設(shè)置是否刪除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表示是否遞歸顯示子目錄下的內(nèi)容
//例子:
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());
//文件權(quán)限
System.out.println(i.getPermission());
//文件屬主
System.out.println(i.getOwner());
//文件數(shù)組
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數(shù)組,無法遞歸顯示子目錄下的內(nèi)容,但是能查看子目錄本身的屬性,用法
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("權(quán)限:" + f.getPermission());
System.out.println("大小:" + f.getLen());
System.out.println("==========================");
}
client.close();
}
9、文件類型判斷
//通過上面的FileStatus和LocatedFileStatus 都可以調(diào)用內(nèi)部的方法判斷當前是文件還是目錄
FileStatus對象.isFile()
LocatedFileStatus對象.isFile()
FileStatus對象.isDirectory()
LocatedFileStatus對象.isDirectory()
1、以IO流方式上傳文件
主要用到的是下面兩個方法:
//這是HDFS專用的數(shù)據(jù)流輸出流
FSDataOutputStream fos = client.create(Path)
//create方法還有以下參數(shù):
boolean overwrite:如果文件文件已存在,是否覆蓋,默認是true
short replication:可以指定副本數(shù),不指定就以hdfs的配置為準
int bufferSize:緩沖區(qū)大小
long blockSize:指定自己使用的塊大小
FsPermission var2:指定權(quán)限
ChecksumOpt checksumOpt:指定校驗值
//下面是對接輸入流和輸出流的工具
IOutils.copyBytes(inputstream,outputstream,buffsize,close)
inputstream 輸入流
outputstream 輸出流
buffsize 緩沖區(qū)
close 是否關(guān)閉流
例子:
@Test
public void putFileFromIO() throws Exception {
FileSystem client = initFileSystem2();
//創(chuàng)建本地文件字節(jié)輸入流
InputStream fis = new FileInputStream("E:\\file\\big data\\java se\\第十八章 Java文件與IO流.md");
//創(chuàng)建hdfs文件字節(jié)輸出流,注意,創(chuàng)建輸出流文件的時候,一定要指定文件名,否則會報錯
Path uploadPath = new Path("/第十八章 Java文件與IO流.md");
FSDataOutputStream fos = client.create(uploadPath);
//輸入流和輸出流對接
try {
//輸入流和輸出流拷貝,后面false表示不關(guān)閉流
IOUtils.copyBytes(fis, fos, 1024,false);
} catch (IOException e) {
e.printStackTrace();
} finally {
//關(guān)閉輸入流和輸出流
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();
//創(chuàng)建本地輸出流,保存內(nèi)容
OutputStream fos = new FileOutputStream("F:\\edit_new.xml");
//創(chuàng)建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);
}
}
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。