刚刚学习了通过Hadoop提供的FileSystem这个API来操作hdfs。主要的操作有在hdfs上创建与删除文件夹、上传下载文件、浏览hdfs下某目录的文件。
1.创建与删除文件夹
-
package com.chi.hdfs;
-
-
import java.net.URI;
-
-
import org.apache.hadoop.conf.Configuration;
-
import org.apache.hadoop.fs.FileSystem;
-
import org.apache.hadoop.fs.Path;
-
-
public class TestOne {
-
static final String PATH = "hdfs://192.168.15.100:9000/";// hdfs地址
-
static final String DIR = "hdfs://192.168.15.100:9000/One";// 所要创建的文件位置
-
-
public static void main(String[] args) throws Exception {
-
FileSystem fileSystem = FileSystem.get(new URI(PATH),
-
new Configuration());
-
-
fileSystem.mkdirs(new Path(DIR));// 创建文件
-
// fileSystem.delete(new Path(DIR), false);//删除文件或目录
-
-
}
-
-
}
删除hdfs下的目录时,若某目录不为空,则第二个参数必须为true,否则报错;当目录为空或删除文件时,第二个参数为false或true都可以。
在做这个测试的时候我遇到了个问题,并没有解决:就是用delete方法删除hdfs根目录下的所有文件夹和文件并没有实现(关键代码:
fileSystem.delete(new Path("hdfs://192.168.15.100:9000/*"), true);),希望路过的大神能帮小弟解惑答疑,谢谢!
2.上传和下载文件
-
package com.chi.hdfs;
-
-
import java.io.FileInputStream;
-
import java.io.FileOutputStream;
-
import java.net.URI;
-
-
import org.apache.hadoop.conf.Configuration;
-
import org.apache.hadoop.fs.FSDataInputStream;
-
import org.apache.hadoop.fs.FSDataOutputStream;
-
import org.apache.hadoop.fs.FileSystem;
-
import org.apache.hadoop.fs.Path;
-
import org.apache.hadoop.io.IOUtils;
-
-
public class TestTwo {
-
static final String PATH = "hdfs://192.168.15.100:9000/";// hdfs地址
-
static final String DIR = "hdfs://192.168.15.100:9000/One";// 所要创建的文件位置
-
static final String FILE = "/One/xixi";
-
-
public static void main(String[] args) throws Exception {
-
FileSystem fileSystem = FileSystem.get(new URI(PATH),
-
new Configuration());
-
// 上传文件
-
FSDataOutputStream out = fileSystem.create(new Path(FILE));
-
FileInputStream in = new FileInputStream("D:/Hadoop/test/哈哈.txt");
-
IOUtils.copyBytes(in, out, 1024, true);
-
-
// 下载文件
-
FSDataInputStream inGet = fileSystem.open(new Path(FILE));
-
FileOutputStream outGet = new FileOutputStream(
-
"D:/Hadoop/test/heihei.txt");
-
IOUtils.copyBytes(inGet, outGet, 1024, true);
-
-
}
-
-
}
此处需要注意的是:在下载文件时,若本地文件存在,执行下载程序后本地文件内的内容会被完全覆盖。若本地文件不存在,则新建文件。
3.
浏览hdfs下某目录的文件
-
package com.chi.hdfs;
-
-
import java.net.URI;
-
-
import org.apache.hadoop.conf.Configuration;
-
import org.apache.hadoop.fs.FileStatus;
-
import org.apache.hadoop.fs.FileSystem;
-
import org.apache.hadoop.fs.Path;
-
-
public class TestThree {
-
static final String PATH = "hdfs://192.168.15.100:9000/";// hdfs地址
-
static final String DIR = "hdfs://192.168.15.100:9000/One";// 所要创建的文件位置
-
-
public static void main(String[] args) throws Exception {
-
FileSystem fileSystem = FileSystem.get(new URI(PATH),
-
new Configuration());
-
FileStatus[] listStatus = fileSystem.listStatus(new Path(DIR));// 得到文件或文件夹的数组
-
for (FileStatus fileStatus : listStatus) { // 遍历数组
-
String isDir = fileStatus.isDirectory() ? "文件夹" : "文件";
-
long len = fileStatus.getLen();
-
String path = fileStatus.getPath().toString();
-
String permission = fileStatus.getPermission().toString();
-
short replication = fileStatus.getReplication();
-
System.out.println(isDir + "\t" + len + "\t" + path + "\t"
-
+ permission + "\t" + replication);
-
}
-
-
}
-
}
在遍历某目录下的文件时并不能递归遍历。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29876573/viewspace-1813498/
,如需转载,请注明出处,否则将追究法律责任。