核心类 org.apache.hadoop.fs.FileSystem 文件系统类 抽象类
//静态方法创建对象
public static FileSystem newInstance(URI uri,Configuration conf,String user)
/*
参数一 URI 分布式文件系统 HDFS的资源地址 NN地址 hdfs://linux01:8020
参数二 Configuration 用户自定义参数设置 副本数 3 物理切块的大小 128M
参数三 user 客户端用户名
*/
/*
org.apache.hadoop.fs.FileSystem 文件系统类 抽象类
静态方法获取对象(子类对象)
public static FileSystem newInstance(URI uri,Configuration conf,String user)
URI uri: 统一资源标识符 协议://
url统一资源定位符 www.baidu.com
只要是网络相关的 都是uri包括url
迅雷下载 百度网盘 邮件发送 mailto: jdbc连接
分布式文件系统 HDFS的资源地址 NN地址
hdfs://linux01:8020
构造方法
public URI uri
Configuration conf:用户自定义参数设置 副本数 3 物理切块的大小 128M
如果不设置 使用默认设置
String user: 用户名 root
*/
public class Demo01_FileSystem {
public static void main(String[] args) throws URISyntaxException, IOException, InterruptedException {
//文件系统的客户端连接对象
URI uri = new URI("hdfs://linux01:8020");
//配置对象 没有进行配置 使用默认配置
Configuration con = new Configuration();
//用户名
String user = "root";
//通过静态方法 获取 分布式文件系统对象
FileSystem fs = FileSystem.newInstance(uri, con, user);
System.out.println(fs);
}
}
常用方法
public void copyFromLocalFile(Path src, Path dst) 将本地文件上传到文件系统
public void copyFromLocalFile(boolean delSrc, Path src, Path dst)
public void copyToLocalFile(Path src, Path dst) 将文件系统上的文件下载到本地
public void copyToLocalFile(boolean delSrc, Path src, Path dst)
public FileStatus[] listStatus(Path f) 列出目录下所有的内容 包括文件 文件夹
public RemoteIterator<LocatedFileStatus> listFiles(Path f, boolean recursive)列出目录下所有的文件
public FSDataOutputStream create(Path f, boolean overwrite) 获取字节输出流 向文件中写数据
public FSDataOutputStream append(Path path) 向指定的文件路径中追加写入数据
public FSDataInputStream open(Path f) 获取字节输入流 读取文件中数据
获取文件系统对象工具类
public class HDFSUtils {
private HDFSUtils(){}
public static FileSystem getFileSystem() throws Exception {
//文件系统的客户端连接对象
URI uri = new URI("hdfs://linux01:8020");
//配置对象 没有进行配置 使用默认配置
Configuration con = new Configuration();
//用户名
String user = "root";
//通过静态方法 获取 分布式文件系统对象
FileSystem fs = FileSystem.newInstance(uri, con, user);
return fs;
}
}
上传文件
public class Demo03_FileSystem {
public static void main(String[] args) throws IOException {
FileSystem fs = HDFSUtils.getFs();
Path src = new Path("d://1.jpg");
Path dest = new Path("/user");
// fs.copyFromLocalFile(src,dest);
//上传并改名
dest = new Path("/user/11.jpg");
// fs.copyFromLocalFile(src,dest);
//上传并删除源文件
// fs.copyFromLocalFile(true,src,dest);
//上传不删除源文件 如文件已存在 报错 如不存在,直接上传
dest = new Path("/user/111.jpg");
fs.copyFromLocalFile(false,false,src,dest);
fs.close();
}
}
下载文件
public class Demo04_FileSystem {
public static void main(String[] args) throws IOException {
FileSystem fs = HDFSUtils.getFs();
Path src = new Path("/user/1.jpg");
Path dest = new Path("d://ideawork//11.jpg");
// fs.copyToLocalFile(src,dest);
dest = new Path("d://ideawork//aaa//111.jpg");
fs.copyToLocalFile(false,src,dest,true);
fs.close();
}
}
遍历文件
public class Demo05_FileSystem {
public static void main(String[] args) throws IOException {
FileSystem fs = HDFSUtils.getFs();
FileStatus[] fileArr = fs.listStatus(new Path("/"));
for (FileStatus fileStatus : fileArr) {
if (fileStatus.isDirectory()){
System.out.println("是文件夹");
}else
{
System.out.println("是文件");
}
System.out.println("权限: "+fileStatus.getPermission());
System.out.println("拥有者: "+fileStatus.getOwner());
System.out.println("组: "+fileStatus.getGroup());
System.out.println("大小: "+fileStatus.getLen());
System.out.println("最后修改时间: "+new Date(fileStatus.getModificationTime()));
System.out.println("副本个数: "+fileStatus.getReplication());
System.out.println("切块大小: "+fileStatus.getBlockSize()/1024/1024);
System.out.println("文件名: "+fileStatus.getPath().getName());
System.out.println("-------------------------------------------------");
}
fs.close();
}
}
写数据
public class Demo07_FileSystem {
public static void main(String[] args) throws IOException {
FileSystem fs = HDFSUtils.getFs();
/* FSDataOutputStream out = fs.create(new Path("/person.txt"), true);
out.write("lzm\r\n".getBytes());
out.write("cyl\r\n".getBytes());
out.close();*/
FSDataOutputStream append = fs.append(new Path("/person.txt"));
append.write("spicy\r\n".getBytes());
append.write("Thirsty\n".getBytes());
append.close();
}
}
读数据
public class Demo08_FileSystem {
public static void main(String[] args) throws IOException {
FileSystem fs = HDFSUtils.getFs();
FSDataInputStream in = fs.open(new Path("/person.txt"));
/*
byte[] bytes = new byte[1024];
int len =0;
while((len = in.read(bytes))!=-1){
System.out.println(new String(bytes,0,len));
}
in.close();*/
InputStreamReader isr = new InputStreamReader(in);
BufferedReader br = new BufferedReader(isr);
String line = null;
while((line = br.readLine())!=null){
System.out.println(line);
}
in.close();
isr.close();
fs.close();
}
}
其他方法
//DistributedFileSystem
public class Demo10_FileSystem {
public static void main(String[] args) throws Exception {
FileSystem fileSystem = HDFSUtils.getFileSystem();
fileSystem.delete(new Path("/1.txt"),true); //删除
fileSystem.mkdirs(new Path("/aaa/bbb") ); //创建文件夹
fileSystem.exists(new Path("/aaa/1.txt")); //判断路径是否存在
//...
fileSystem.close();
}
}
小文件合并
public class Demo10_FileSystem {
public static void main(String[] args) throws IOException {
FileSystem fs = HDFSUtils.getFs();
FSDataOutputStream out = fs.create(new Path("/java/big2.txt"));
/*
File dir = new File("d:\\ideawork\\bbb");
File[] files = dir.listFiles();
for (File file : files) {
InputStream in = new FileInputStream(file);
IOUtils.copy(in,out);
IOUtils.closeQuietly(in);
}
IOUtils.closeQuietly(out);*/
LocalFileSystem local = FileSystem.getLocal(new Configuration());
FileStatus[] fileArr = local.listStatus(new Path("d:\\ideawork\\bbb"));
for (FileStatus fileStatus : fileArr) {
Path path = fileStatus.getPath();
FSDataInputStream in = local.open(path);
IOUtils.copy(in,out);
IOUtils.closeQuietly(in);
}
IOUtils.closeQuietly(out);
}
}