JavaAPI实现hdfs文件增删改查

package com.aimuti.hadoop.hdfs;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.junit.Before;
import org.junit.Test;
/*
 * 用客户端的JavaAPI实现增删改查
 */
public class HdfsClientDemo {
	Configuration conf;
	FileSystem fs;
	@Before
	public void init() throws IOException, InterruptedException, URISyntaxException {
		/**
		 * 初始化操作应该获得一个分布式系统的客户端
		 * 利用分布式系统的JavaAPI拿到客户端实现通信
		 * 构造一个配置参数对象,设置参数:我们访问HDFS的uri
		 * 从而FileSystem.get()方法就知道应该去构造一个
		 * 访问HDFS文件系统的客户端,以及new Configuration()
		 * 的时候,它会去加载jar包的hdfs-default.xml然后加载
		 * classpath下的hdfs-site.xml
	     */
		conf = new Configuration();
		/*
		 * 参数优先级: 1.客户端代码中设置的值  2.classpath下用户自定义配置
		 * 3.服务器默认配置
		 */
		conf.set("dfs.replication", "2");
		conf.set("dfs.block.size", "64m");
	    fs = FileSystem.get(new URI("hdfs://cdh:9000"), conf, "root");
	}
//	本地文件上传hdfs
	@Test
	public void testUpload() throws IllegalArgumentException, IOException {
		fs.copyFromLocalFile(new Path("C:\\Hello.java"), new Path("/Hello_copy"));
		fs.close();
	}
//	hdfs文件下载到本地
	@Test
	public void testDownload() throws IllegalArgumentException, IOException {
//		true是指调用本地Java的IO流进行写数据
		fs.copyToLocalFile(false, new Path("/Hello_copy"), new Path("D:\\"), true);
		fs.close();
	}
//	文件的创建 多级文件目录的创建
	@Test
	public void testMkdir() throws IllegalArgumentException, IOException {
		boolean mkdirs = fs.mkdirs(new Path("/BBB/bbb/ccc"));
		System.out.println(mkdirs);
	}
//	文件的删除
	@Test
	public void testDelete() throws IllegalArgumentException, IOException {
//		true:指的是是否递归删除
		boolean delete = fs.delete(new Path("/BBB/bbb"), false);
		System.out.println(delete);
	}
//	查询指定目录下的所有子文件
	@Test
	public void testList() throws FileNotFoundException, IllegalArgumentException, IOException {
		RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), false);
		while (listFiles.hasNext()) {
			LocatedFileStatus fileStatus = listFiles.next();
			System.out.println("blockSize:"+fileStatus.getBlockSize());
			System.out.println("owner:"+fileStatus.getOwner());
			System.out.println("Replication:"+fileStatus.getReplication());
			System.out.println("permission:"+fileStatus.getPermission());
			System.out.println("name:"+fileStatus.getPath().getName());
		}
	}
	
}
package com.aimuti.hadoop.hdfs;
/*
 * 用流的方式来操作hdfs上的文件,可以实现读取指定偏移量范围内的数据
 */

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.net.URI;
import org.apache.commons.io.IOUtils;
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.junit.Before;
import org.junit.Test;

public class HdfsStreamAccess {
	
	Configuration conf;
	FileSystem fs;
	@Before
	public void init() throws Exception {
//	初始化操作应该获取一个分布式系统客户端
//	利用分布式系统的JavaAPI获取客户端实现通信
		conf = new Configuration();
		fs = FileSystem.get(new URI("hdfs://cdh:9000"), conf, "root");
	}
	
//	通过流的方式进行文件上传
	@SuppressWarnings("resource")
	@Test
	public void testUpload() throws Exception{
//		true:代表是否覆盖(重写)
		FSDataOutputStream outputStream = fs.create(new Path("/luban"), true);
//		要想将数据写到输出流,首先要在本地写个输入流
		FileInputStream inputStream = new FileInputStream("D:\\后裔.txt");
//		用commons.io.utils比较方便,边读边写
		IOUtils.copy(inputStream, outputStream);
	}
	
//	通过流的方式指定下载部分文件
	@SuppressWarnings("resource")
	@Test
	public void testRandomAcess() throws Exception {
		FSDataInputStream inputStream = fs.open(new Path("/luban"));
//		将指针拨到6个字节处 从此开始读
		inputStream.seek(6);
		FileOutputStream outputStream = new FileOutputStream("D:\\后裔");
		IOUtils.copy(inputStream, outputStream);
	}
	
//	显示hdfs上文件的内容,相当于cat功能
	@Test
	public void test() throws Exception {
		FSDataInputStream inputStream = fs.open(new Path("/luban"));
		IOUtils.copy(inputStream,System.out);
	}
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值