HDFS客户端操作(JAVA代码) 环境准备 maven所需依赖 实际操作

windows需要配置hadoop的windows下的依赖

安装包地址:

链接:https://pan.baidu.com/s/1QtbH-x-S0QytkmaoSosdEw
提取码:2ktw

将安装包解压至自己所选择的目录,然后配置环境变量:

HADOOP_HOME : 解压的目录

PATH后新增:%HADOOP_HOME%in

maven所需依赖

新建Maven项目,添加以下依赖:

<dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.12.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>3.1.3</version>
        </dependency>

实际操作

实际操作前先讲所需要的对象设为全局变量,方便今后操作:

private URI uri;
private Configuration configuration;
private String user;
private FileSystem fileSystem;

使用@Before注释的函数,可以在@Test注释下的函数运行前执行,可以进行对象的初始化:

	@Before
    public void init() throws IOException, InterruptedException {
        uri = URI.create("hdfs://hadoop100:8020");
        configuration = new Configuration();
        user = "nevesettle";
        fileSystem = FileSystem.get(uri,configuration,user);
    }

@After则相反

	@After
    public void closeFs() throws IOException {
        fileSystem.close();
    }

文件上传

	/**
     * 上传文件
     * @throws IOException
     */
    @Test
    public void uploadFile() throws IOException {
        fileSystem.copyFromLocalFile(false,false,
                new Path("D:\Program files\QQ\QQ Data\794133319\FileRecv\资源集合.txt"),
                new Path("/"));
    }

使用的函数为:

copyFromLocalFile(boolean delSrc, boolean overwrite,Path src, Path dst)
  • delSrc:是否删除源文件
  • overwrite:目标地址有相同文件是否覆盖
  • src:源文件地址
  • dst:目标文件地址

文件下载

	/**
     * 文件下载
     * @throws IOException
     * @throws InterruptedException
     */
    @Test
    public void downFile() throws IOException {
        fileSystem.copyToLocalFile(false,
                new Path("/资源集合.txt"),
                new Path("d:\"),
                true);
    }

使用的函数为:

copyToLocalFile(boolean delSrc, Path src, Path dst,boolean useRawLocalFileSystem)
  • delSrc:是否删除源文件
  • src:源文件地址
  • dst:目标文件地址
  • useRawLocalFileSystem:是否进行文件传输校验(CRC校验)

文件更名及移动位置

	/**
     * 文件名字修改
     * @throws IOException
     * @throws InterruptedException
     */
    @Test
    public void updateFile() throws IOException {
        fileSystem.rename(new Path("/资源集合.txt"),
                new Path("/资源.txt"));
    }

使用的函数为:

rename(Path src, Path dst)
  • src:源文件
  • dst:目标文件
  • 前后目录相同,文件名不同,则是修改文件名
  • 前后目录不同,文件名相同,则是修改目录
  • 前后目录和文件名都不同,则是移动位置并修改文件名

文件删除

	/**
     * 文件删除
     * @throws IOException
     * @throws InterruptedException
     */
    @Test
    public void deleteFile() throws IOException {
        fileSystem.delete(new Path("/资源.txt"),false);
    }

使用的函数为:

delete(Path f, boolean recursive)
  • f:删除的文件或目录地址
  • recursive:是否递归删除
  • 当要删除的为文件是,递归删除为false
  • 当要删除的是目录且为空时,递归删除为false
  • 当要删除的是目录且不为空,则递归删除为true

IO流的文件上传

   /**
     * IO流的文件上传
     * @throws IOException
     * @throws InterruptedException
     */
    @Test
    public void uploadFileByIO() throws IOException {
        //源文件地址
        String srcFilePath = "D:\资源集合.txt";
        //目标文件地址
        String destFilePath = "/资源集合.txt";
        //输入流
        FileInputStream fis = new FileInputStream(new File(srcFilePath));
        //通过hdfs封装的方法获取输出流
        FSDataOutputStream fos = fileSystem.create(new Path(destFilePath));

        //最原始的方法
//        int i = 0;
//        while ( ( i = fis.read()) != -1 ){
//            fot.write(i);
//        }

        //hdfs封装的方法
        IOUtils.copyBytes(fis,fos,configuration);

        //关闭IO流
        IOUtils.closeStream(fis);
        IOUtils.closeStream(fos);

    }
  • IOUtils 使用时注意要使用hadoop的包,不要使用错了
  • configuration 为我们的全局变量,即配置

IO流的文件下载

	/**
     * IO流的文件下载
     * @throws IOException
     * @throws InterruptedException
     */
    @Test
    public void downFileByIO() throws IOException {

        //源文件
        String srcFilePath = "/资源集合.txt";

        //目标文件
        String destFilePath = "d:\资源.txt";

        //获得输入流
        FSDataInputStream fis = fileSystem.open(new Path(srcFilePath));

        //获得输出流
        FileOutputStream fos = new FileOutputStream(new File(destFilePath));

        //传输
        IOUtils.copyBytes(fis,fos,configuration);

        //关闭
        IOUtils.closeStream(fis);
        IOUtils.closeStream(fos);


    }