hadoop学习笔记--5.HDFS的java api接口访问

hadoop学习笔记--5.HDFS的java api接口访问

一:几个常用类介绍

    (1):configuration类:此类封装了客户端或服务器的配置,通过配置文件来读取类路径实现(一般是core-site.xml)。
(2):FileSystem类:一个通用的文件系统api,用该对象的一些方法来对文件进行操作。
FileSystem fs = FileSystem.get(conf);通过FileSystem的静态方法get获得该对象。
(3):FSDataInputStream:HDFS的文件输入流,FileSystem.open()方法返回的即是此类。
(4):FSDataOutputStream:HDFS的文件输入出流,FileSystem.create()方法返回的即是此类。

二:创建文件目录

public static void mkdir(String path) throws IOException {
		 //读取配置文件
		Configuration conf = new Configuration();
		//获取文件系统
		FileSystem fs = FileSystem.get(URI.create("hdfs://hadoop1:9000"),conf);
		
		Path srcPath =  new Path(path);
		//调用mkdir()创建目录,(可以一次性创建,以及不存在的父目录)
		boolean flag = fs.mkdirs(srcPath);
		if(flag) {
			 System.out.println("create dir ok!");
		}else {
			 System.out.println("create dir failure");
		}
		
		//关闭文件系统
		fs.close();
	}

三:删除文件/目录

/*** 删除文件或者文件目录 
	 * @throws IOException **/
	public static void rmdir(String filePath) throws IOException {
		//读取配置文件
		Configuration conf = new Configuration();
		//获取文件系统
		FileSystem fs = FileSystem.get(URI.create("hdfs://hadoop1:9000"),conf);
		Path path = new Path(filePath);
		
		//调用deleteOnExit()
		boolean flag = fs.deleteOnExit(path);
		//	fs.delete(path);
		if(flag) {
			 System.out.println("delete ok!");
		}else {
			 System.out.println("delete failure");
		}
		
		//关闭文件系统
		fs.close();
	}

四:创建文件

/**创建文件**/
	 public static void createFile(String dst , byte[] contents) throws IOException{
		//读取配置文件
		Configuration conf = new Configuration();
		//获取文件系统
		FileSystem fs = FileSystem.get(URI.create("hdfs://hadoop1:9000"),conf);
		//目标路径
		Path dstPath = new Path(dst);  
		//打开一个输出流
		FSDataOutputStream outputStream = fs.create(dstPath);
		outputStream.write(contents);
		
		//关闭文件系统
		outputStream.close();
		fs.close();
		System.out.println("文件创建成功!");
		
	 }

五:列出目录下的文件

 /**列出文件**/
	 public static void listFile(String path) throws IOException{
		//读取配置文件
		Configuration conf = new Configuration();
		//获取文件系统
		FileSystem fs = FileSystem.get(URI.create("hdfs://hadoop1:9000"),conf);
		//获取文件或目录状态
		FileStatus[] fileStatus = fs.listStatus(new Path(path));
		//打印文件的路径
		for (FileStatus file : fileStatus) {
			System.out.println(file.getPath());
		}
	 
		//关闭文件系统
		fs.close();
	 }



六:上传本地文件

 /**上传本地文件**/
	 public static void uploadFile(String src,String dst) throws IOException{
		//读取配置文件
		Configuration conf = new Configuration();
		//获取文件系统
		FileSystem fs = FileSystem.get(URI.create("hdfs://hadoop1:9000"),conf);
		Path srcPath = new Path(src); //原路径
		Path dstPath = new Path(dst); //目标路径
		//调用文件系统的文件复制函数,前面参数是指是否删除原文件,true为删除,默认为false
		fs.copyFromLocalFile(false,srcPath, dstPath);
		
		//打印文件路径
		System.out.println("Upload to "+conf.get("fs.default.name"));
		System.out.println("------------list files------------"+"\n");
		FileStatus [] fileStatus = fs.listStatus(dstPath);
		for (FileStatus file : fileStatus) {
			System.out.println(file.getPath());
		}
		
		//关闭文件系统
		fs.close();
	 }

七:文件重命名

/**文件重命名**/
	 public static void renameFile(String oldName,String newName) throws IOException{
		//读取配置文件
		Configuration conf = new Configuration();
		//获取文件系统
		FileSystem fs = FileSystem.get(URI.create("hdfs://hadoop1:9000"),conf);
		Path oldPath = new Path(oldName);
		Path newPath = new Path(newName);
		
		boolean flag = fs.rename(oldPath, newPath);
		if(flag) {
			 System.out.println("rename ok!");
		}else {
			 System.out.println("rename failure");
		}
		
		//关闭文件系统
		fs.close();
	 }

八:读取文件内容

public static void readFile(String uri) throws IOException {
		//读取配置文件
		Configuration conf = new Configuration();
		//获取文件系统
		FileSystem fs = FileSystem.get(URI.create("hdfs://hadoop1:9000"),conf);
		
		InputStream in = null;
		try {
			in = fs.open(new Path(uri));
			//复制到标准输出流
			IOUtils.copyBytes(in, System.out, 4096,false);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			IOUtils.closeStream(in);
		}
	}

九:判断目录是否存在

 //判断目录是否存在
	 public static boolean existDir(String filePath,boolean create) {
		 boolean flag = false;
		 //判断是否存在
		 if(StringUtils.isEmpty(filePath)) {
			 return flag;
		 }
		 
		Path path = new Path(filePath);
		//读取配置文件
		Configuration conf = new Configuration();
		try {
			//获取文件系统
			FileSystem fs = FileSystem.get(URI.create("hdfs://hadoop1:9000"),conf);
		
			//或者create为true
			if(create) {
				//如果文件不存在
				if(!fs.exists(path)) {
					fs.mkdirs(path);
				}
			}
			
			//判断是否为目录
			if(fs.isDirectory(path)) {
				 flag = true;
			}
		}catch (Exception e){
			e.printStackTrace();
		}
		return flag;
	}



十:追加到文件末尾

/**添加到文件的末尾(src为本地地址,dst为hdfs文件地址)
	 * @throws IOException */
	 public static void appendFile(String src,String dst) throws IOException {
		 //读取配置文件
			Configuration conf = new Configuration();
			//获取文件系统
			FileSystem fs = FileSystem.get(URI.create("hdfs://hadoop1:9000"),conf);
			Path dstPath = new Path(dst);
			//创建需要写入的文件流
			InputStream in = new BufferedInputStream(new FileInputStream(src));
			
			//文件输出流写入
			FSDataOutputStream out = fs.append(dstPath);
			IOUtils.copyBytes(in, out, 4096,true);
			
			fs.close();
	 }

十一:主函数

public class HdfsJavaApi {
	public static void main(String[] args) throws IOException {
		//读取文件内容
		//readFile(args[0]);
		//创建文件目录
		/*String s= "hello";
		byte[] bytes = s.getBytes();
		createFile("/liu/h.txt",bytes);*/
		
		//删除文件
		/*rmdir("/liu2");*/
		
		//上传文件
		/*uploadFile("/home/liu/hello.text", "/liu/hello.text");*/
	
		//列出文件
		/*listFile("/liu");*/
		
		//文科重命名
		/*renameFile("/liu/hi.txt", "/liu/he1.text");*/
		
		//查询目录是否存在
		/*boolean existDir = existDir("/liu2", false);
		System.out.println(existDir);*/
		
		//写入文件末尾
		appendFile("/home/liu/hello.text","/liu1/hello.text");
	}



十二:注意要点

1: FileSystem的get()方法有两个。
FileSystem fs = FileSystem.get(URI.create("hdfs://hadoop1:9000"),conf);  //默认在hdfs上读取文件
FileSystem fs = FileSystem.get(conf);   //默认从本地上读取文件

hdfs://hadoop1:9000需要与core-site.xml配置文件一致。也可以写成URI.create(uri),不过此种写法在文件路径最头处一定要加上hdfs://hadoop1:9000

2:参数从main函数中的args中获得,Eclipse中选择带参运行
hadoop学习笔记--5.HDFS的java api接口访问_第1张图片

hadoop学习笔记--5.HDFS的java api接口访问_第2张图片

你可能感兴趣的:(Hadoop)