Java API 操作HDFS文件

这篇具有很好参考价值的文章主要介绍了Java API 操作HDFS文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用JavaAPI操作hdfs 文件的常用操作代码

1.创建目录

​@Test
public void mkdir() throws Exception{
    fileSystem.mkdir(new Path("/hdfsapi/test"));
}

​

2.创建文件

@Test
​
public void create() throws Exception{

    FSDataOutputStream output = fileSystem.create(new Path("/hdfsapi/test/a.txt"));
    output.write("hello world".getBytes());
    output.flush();
    output.close();
}

3.重命名

@Test
​
public void rename() throws Exception{

    Path oldPath = new Path("/hdfsapi/test/a.txt");
    Path newPath = new Path("/hdfsapi/test/b.txt");
    System.out.println(fileSystem.rename(oldPath,newPath));

}

4.上传本地文件到hdfs

@Test
​
public void copyFromLocalFile() throws Exception{

    Path src = new Path("/home/hadoop/data/hello.txt");
    Path dist = new Path("/hdfsapi/test/");
    fileSystem.copyFromLocalFile(src,dist);

}

5.查看某个目录下的所有文件

@Test
​
public void listFiles() throws Exception{

    FileStatus[] listStatus = fileSystem.listStatus(new Path("/hdfsapi/test"));
    for (FileStatus fileStatus : listFiles){
        String isDir = fileStatus.isDirectory() ? "文件夹" : "文件" ;
        String permission = fileStatus.getPermission().toString();
        short replication = fileStatus.getReplication();
        long len = fileStatus.getLen();
        String path = fileStatus.getPath().toString();
        System.out.println(isDir+"\t"+permission+"\t"+replication+"\t"+long+"\t"+path)

    }
}

6.查看文件块信息

@Test
​
public void getFileBlockLocations() throws Exception{

    FileStatus fileStatus = fileSystem.getFileStatus(new Path("/hdfsapi/test/b.txt"));
    BlockLocation[] blocks = fileSystem.getFileBlockLocations(fileStatus,0,fileStatus.getLen());
    for (BlockLocation block:blocks){
        for (String host:block.getHosts()){
            System.out.println(host);
        }

    }
}

7.文件读写

public class hdfs {

    public static void main(String[] args) throws IOException {
		//请在 Begin-End 之间添加代码,完成任务要求。
        /********* Begin *********/
        Configuration conf = new Configuration();//configuration类实现hadoop各模块之间值的传递
        FileSystem fs = FileSystem.get(conf);  //获取文件系统
        Path file = new Path("/user/hadoop/myfile"); 
        FSDataOutputStream outStream = fs.create(file); //获取输出流
        outStream.writeUTF("https://www.educoder.net");//可以写入任意字符
        outStream.close();//记得关闭输出流
        FSDataInputStream inStream = fs.open(file);  //获取输入流
        String data = inStream.readUTF();  //读取文件
        		/********* End *********/


    }
  }

8.文件上传

​
public class hdfs {

      /**
     * 判断路径是否存在
     */
    public static boolean test(Configuration conf, String path) throws IOException {
        /*****start*****/
        //请在此处编写判断文件是否存在的代码
        try(FileSystem fs = FileSystem.get(conf)){
            return fs.exists(new Path(path));
        } catch (IOException e){
            e.printStackTrace();
            return false;
        }   
        /*****end*****/
    }

    /**
     * 复制文件到指定路径
     * 若路径已存在,则进行覆盖
     */
    public static void copyFromLocalFile(Configuration conf, String localFilePath, String remoteFilePath) throws IOException {
        /*****start*****/
        //请在此处编写复制文件到指定路径的代码

        Path localPath = new Path(localFilePath);  
        Path remotePath = new Path(remoteFilePath);  
        try (FileSystem fs = FileSystem.get(conf)) { 
        fs.copyFromLocalFile(false, true, localPath, remotePath);  
         } catch (IOException e) {  
            e.printStackTrace();  
         }  

        /*****end*****/
    }

    /**
     * 追加文件内容
     */
    public static void appendToFile(Configuration conf, String localFilePath, String remoteFilePath) throws IOException {
       /*****start*****/
         //请在此处编写追加文件内容的代码

        Path remotePath = new Path(remoteFilePath);  
    try (FileSystem fs = FileSystem.get(conf);  
            FileInputStream in = new FileInputStream(localFilePath);) {  
        FSDataOutputStream out = fs.append(remotePath);  
        byte[] data = new byte[1024];  
        int read = -1;  
        while ((read = in.read(data)) > 0) {  
            out.write(data, 0, read);  
        }  
        out.close();  
    } catch (IOException e) {  
        e.printStackTrace();  
    }  

        /*****end*****/
    }
}


​

9.文件下载

public class hdfs {
     /**
     * 下载文件到本地
     * 判断本地路径是否已存在,若已存在,则自动进行重命名
     */
    public static void copyToLocal(Configuration conf, String remoteFilePath, String localFilePath) throws IOException {
        FileSystem fs = FileSystem.get(conf);
        Path remotePath = new Path(remoteFilePath);
        File f = new File(localFilePath);
        /*****start*****/
        /*在此添加判断文件是否存在的代码,如果文件名存在,自动重命名(在文件名后面加上 _0, _1 ...) */
        if (f.exists()) {
            System.out.println(localFilePath + " 已存在.");
            Integer i = 0;
            while (  true) {
                f = new File(  localFilePath + "_" + i.toString()     );
                if (!f.exists()  ) {
                    localFilePath = localFilePath + "_" + i.toString()      ;
                    break;
                }
            }
            System.out.println("将重新命名为: " + localFilePath);
        }
        /*****end*****/

        /*****start*****/
        // 在此添加将文件下载到本地的代码
        Path localPath = new Path(localFilePath);   
        fs.copyToLocalFile(remotePath, localPath);
       /*****end*****/
       fs.close();
    }

10.使用字节流读取数据


     /**
     * 读取文件内容
     */
    public static void cat(Configuration conf, String remoteFilePath) throws IOException {

        /*****start*****/
        //1.读取文件中的数据
        Path remotePath = new Path(remoteFilePath); 
        FileSystem fs = FileSystem.get(conf); 
        FSDataInputStream in = fs.open(remotePath); 
        BufferedReader d = new BufferedReader(new InputStreamReader(in));      
        String line = null; 
        StringBuffer buffer = new StringBuffer();
        while ((line = d.readLine()) != null) 
        { buffer.append(line); } 
        String res = buffer.toString();

        //2.将读取到的数据输出到  /tmp/output/text.txt 文件中  提示:可以使用FileWriter

        FileWriter f1=new FileWriter("/tmp/output/text.txt");
        f1.write(res);
        f1.close();
       /*****end*****/
    }

11.删除文件

     /**
     * 删除文件 
     */
    public static boolean rm(Configuration conf, String remoteFilePath) throws IOException {
        /*****start*****/        
        //请在此添加删除文件的代码
        FileSystem fs = FileSystem.get(conf);
        Path remotePath = new Path(remoteFilePath);
        boolean result = fs.delete(remotePath,false);

        return   true    ;


        /*****end*****/
    }

12.删除文件夹

public class hdfs {
        /**
     * 判断目录是否为空
     * true: 空,false: 非空
     */
    public static boolean isDirEmpty(Configuration conf, String remoteDir) throws IOException {
        FileSystem fs = FileSystem.get(conf);
        Path dirPath = new Path(remoteDir);
        RemoteIterator<LocatedFileStatus> remoteIterator = fs.listFiles(dirPath, true);
        return !remoteIterator.hasNext();
    }
    /**
     * 删除目录
     */
    public static boolean rmDir(Configuration conf, String remoteDir, boolean recursive) throws IOException {
        FileSystem fs = FileSystem.get(conf);
        Path dirPath = new Path(remoteDir);
        /* 第二个参数表示是否递归删除所有文件 */
        boolean result = fs.delete(dirPath, recursive);
        fs.close();
        return result;
    }
}

13.自定义数据输入流文章来源地址https://www.toymoban.com/news/detail-508367.html

public class MyFSDataInputStream extends FSDataInputStream {
    public MyFSDataInputStream(InputStream in) {
        super(in);
    }
   /**
    * 实现按行读取     * 每次读入一个字符,遇到"\n"结束,返回一行内容
     */
    public static String readline(BufferedReader br) throws IOException {
        char[] data = new char[1024];
        int read = -1;
        int off = 0; // 循环执行时,br 每次会从上一次读取结束的位置继续读取,因此该函数里,off 每次都从0开始
        while ( (read = br.read(data, off, 1)) != -1 ) {
            if (String.valueOf(data[off]).equals("\n") ) {
                off += 1;
                return String.valueOf(data, 0, read);
            }
            off += 1;
            return String.valueOf(data, 0, read);
        }
        return null;
    }
    /**
     * 读取文件内容
     */
    public static void cat(Configuration conf, String remoteFilePath) throws IOException {
        FileSystem fs = FileSystem.get(conf);
        Path remotePath = new Path(remoteFilePath);
        FSDataInputStream in = fs.open(remotePath);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        FileWriter f = new FileWriter("/tmp/output/text.txt");
        String line = null;
        while ( (line = MyFSDataInputStream.readline(br)) != null ) {
            f.write(line);
        }
        f.close();
        br.close();
        in.close();
        fs.close();
    }
}

到了这里,关于Java API 操作HDFS文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 大数据学习:使用Java API操作HDFS

    一、创建Maven项目 二、添加依赖 在 pom.xml 文件里添加 hadoop 和 junit 依赖 三、创建日志属性文件 在 resources 目录里创建 log4j.properties 文件 代码 四、在HDFS上创建文件 在 /ied01 目录创建 hadoop2.txt 文件 创建 net.xxr.hdfs 包,在包里创建 CreateFileOnHDFS 类 编写 create1() 方法 结果 利用H

    2024年02月08日
    浏览(39)
  • javaAPI操作Elasticsearch_elasticsearch 修改字段 java api

    } } import com.zyw.elasticsearchdemo.constants.HotelConstants; import org.apache.http.HttpHost; import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.indices.Create

    2024年04月17日
    浏览(34)
  • HDFS常用操作以及使用Spark读取文件系统数据

    掌握在Linux虚拟机中安装Hadoop和Spark的方法; 熟悉HDFS的基本使用方法; 掌握使用Spark访问本地文件和HDFS文件的方法。 启动Hadoop,在HDFS中创建用户目录“/user/hadoop” 在Linux系统的本地文件系统的“/home/hadoop”目录下新建一个文本文件test.txt,并在该文件中随便输入一些内容,

    2024年04月22日
    浏览(43)
  • 大数据上课笔记之使用Java API操作HDFS

    目录 一、HDFS Java API的了解 1、HDFS常见类与接口  二、编写Java程序访问HDFS 1、在IEDA上创建Maven项目 2、添加相关依赖 3、创建日志属性文件 4、启动集群HDFS服务 5、在HDFS上创建文件  6、写入HDFS文件  7、读取HDFS文件  8、重命名目录或文件 9、显示文件列表  9.1、显示指定目录

    2024年02月07日
    浏览(38)
  • 使用Hadoop 的 Java API 操纵 HDFS 文件系统

    使用 Java 操作 HDFS 文件系统可以使用其对应的Java API,即对应三个 jar 依赖包: hadoop-common.jar (该文件在 hadoop-2.10.1.tar.gz 压缩包中的 sharehadoopcommon 目录下) hadoop-hdfs.jar (该文件在 hadoop-2.10.1.tar.gz 压缩包中的 sharehadoophdfs 目录下) hadoop-client.jar (该文件在 hadoop-2.10.1.tar.gz 压缩包

    2023年04月25日
    浏览(40)
  • Hadoop 使用Linux操作系统与Java熟悉常用的HDFS操作

    注意看评论区获取完整代码资料 目录 一、实验目的 二、实验平台 三、实验步骤 理解HDFS在Hadoop体系结构中的角色; 熟练使用HDFS操作常用的Shell命令; 熟悉HDFS操作常用的Java API。 操作系统:Linux(建议Ubuntu16.04); Hadoop版本:2.7.1; JDK版本:1.8或以上版本; Java IDE:Eclipse。

    2024年02月03日
    浏览(53)
  • 【Elasticsearch学习笔记五】es常用的JAVA API、es整合SpringBoot项目中使用、利用JAVA代码操作es、RestHighLevelClient客户端对象

    目录 一、Maven项目集成Easticsearch 1)客户端对象 2)索引操作 3)文档操作 4)高级查询 二、springboot项目集成Spring Data操作Elasticsearch 1)pom文件 2)yaml 3)数据实体类 4)配置类 5)Dao数据访问对象 6)索引操作 7)文档操作 8)文档搜索 三、springboot项目集成bboss操作elasticsearch

    2023年04月09日
    浏览(51)
  • HDFS Java API 操作

    Hadoop是使用Java语言编写的,因此使用Java API操作Hadoop文件系统,HDFS Shell本质上就是对Java API的应用,通过编程的形式,操作HDFS,其核心是使用HDFS提供的Java API构造一个访问客户端对象,然后通过客户端对象对HDFS上的文件进行操作(增,删,改,查) 1、hdfs 常见类与接口 Hadoop

    2023年04月12日
    浏览(41)
  • Java Api操作HDFS

    链接:https://pan.baidu.com/s/1yUnJh-j9EKmL2hPF8biAtg?pwd=dv12 提取码:dv12 之前配置的 Hadoop 的 core-site.xml 文件中的配置的 fs.defaultFS 地址是 hdfs://localhost:9000 ,然后后面 Java 连不上 hdfs 9000 端口也是打开了,但就是连不上 9870 端口也能正常访问 防火墙也关闭了,也不行 查阅诸多资料发现问

    2024年04月28日
    浏览(45)
  • HDFS 的Java API操作

    1、环境搭建 基于Linux的Hadoop(2.7.4)集群 windowsp平台的hadoop JDK hadoop和jdk的环境变量 IDEA 2、下载windowsp平台的hadoop,版本要与Linux下的一致 可以使用下载的Linux平台的Hadoop解压。然后在/bin目录下添加Windows相关依赖winutils.exe、winutils.pdb、hadoop.dll 然后在目录hadoopwhadoop-2.7.4etchad

    2024年02月04日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包