首先,重点重复重复再重复:

/**
 * 使用Java API操作HDFS文件系统
 * 关键点:
 * 1)创建 Configuration
 * 2)获取 FileSystem
 * 3)...剩下的就是 HDFS API的操作了
*/

回顾:https://www.cnblogs.com/Liuyt-61/p/10737466.html

先上代码(注意包不要导错了):

public class HDFSApp {
public static final String HDFS_PATH = "hdfs://hadoop000:8020";
FileSystem fileSystem = null;
Configuration configuration = null; @Before
public void setUp() throws Exception{
System.out.println("setUp-----------");
configuration = new Configuration();/*
* 构造一个访问制定HDFS系统的客户端对象
* 第一个参数:HDFS的URI
* 第二个参数:客户端制定的配置参数
* 第三个参数:客户端的身份,说白了就是用户名
*/
fileSystem = FileSystem.get(new URI(HDFS_PATH),configuration,"hadoop");
} /*
* 查看HDFS内容
*/
@Test
public void text() throws Exception{
FSDataInputStream in = fileSystem.open(new Path("/README.txt"));
IOUtils.copyBytes(in,System.out,1024);
} /*
* 创建文件
*/
@Test
public void create() throws Exception{
FSDataOutputStream out = fileSystem.create(new Path("/hdfsapi/test/a.txt"));
out.writeUTF("Hello hadoop");
out.flush();//输出走缓冲区,所以先flush
out.close();
} @After
public void tearDown(){
configuration = null;
fileSystem = null;
System.out.println("----------tearDown------");
}
}

首先可以先通过hadoop命令将本地的随便的一个txt文件传入文件系统 / 目录下来做测试,例如README.txt

hadoop fs -put /home/hadoop/README.txt /

我们使用ls查看下是否上传成功,ls查看已经显示存在我们刚刚上传的 README.txt文件,我们进行下一步操作

[hadoop@hadoop000 ~]$ hadoop fs -ls /

Found 2 items
-rw-r--r-- 1 hadoop supergroup 1366 2019-04-19 16:19 /README.txt
drwxr-xr-x - hadoop supergroup 0 2019-04-19 16:11 /hdfsapi

查看HDFS文件内容:使用fileSystem的open方法打开文件,方法怎么用?Ctrl点进去源码:

/**
* Opens an FSDataInputStream at the indicated Path.
* @param f the file to open
* 功能:在指定路径打开fsdatainputstream。
* @参数 f 要打开的文件
*/
public FSDataInputStream open(Path f) throws IOException {
return open(f, getConf().getInt("io.file.buffer.size", 4096));
}

告诉我们方法功能是在指定路径打开FSDataInputStream

参数f是要打开的文件的Path,返回值是FSDataInputStream,这是什么?看名字这是一个文件系统数据的输入流,同样可以Ctrl点进去看源码的注释介绍。

然后我们需要使用一个IOUtils类来将fsdatainputstream流中的数据打印输出。IOUtils是什么呢?同样哪里不会Ctrl点哪里!

源码中类的介绍是:An utility class for I/O related functionality.( I/O相关功能的实用程序类。)

使用IOUtils的copyBytes方法将fsdatainputstream流中的数据打印输出到控制台显示。Ctrl点进去看这个方法怎么用:

/**
* Copies from one stream to another.
*
* @param in InputStrem to read from
* @param out OutputStream to write to
* @param buffSize the size of the buffer
*/
public static void copyBytes(InputStream in, OutputStream out, int buffSize)
throws IOException {
PrintStream ps = out instanceof PrintStream ? (PrintStream)out : null;
byte buf[] = new byte[buffSize];
int bytesRead = in.read(buf);
while (bytesRead >= 0) {
out.write(buf, 0, bytesRead);
if ((ps != null) && ps.checkError()) {
throw new IOException("Unable to write to output stream.");
}
bytesRead = in.read(buf);
}
}

看代码注释地方介绍了该方法的功能是从一个流复制到另一个流,介绍了各个参数,所以我们能够写出代码:


FSDataInputStream in = fileSystem.open(new Path("/README.txt"));
IOUtils.copyBytes(in,System.out,1024);

我们运行测试类text()即可在IDEA控制台看到输出README.txt的内容。

既然能够读取文件内容那自然可以创建文件并写入内容。

使用fileSystem的create()方法进行创建fsdataoutpustream(正好与上面的fsdatainputstream对应):
 /**
* Create an FSDataOutputStream at the indicated Path.
* Files are overwritten by default.
* @param f the file to create
* 在指定路径创建fsdataoutputstream。
* 默认情况下会覆盖文件。
* @参数 f 要创建的文件
*/
public FSDataOutputStream create(Path f) throws IOException {
return create(f, true);
}

使用out的write方法进行写操作,例如使用writeUTF():

out.writeUTF("Hello hadoop");
out.flush();//输出走缓冲区,所以先flush
out.close();//关闭fsdataoutputstream

out的写还有很多方法,每个方法都可以Ctrl点进去看方法的介绍。

运行create测试方法之后,我们可以回到终端控制台使用先使用hadoop的-ls命令查看文件是否创建成功,再使用-text命令查看是否写入内容成功。

[hadoop@hadoop000 ~]$ hadoop fs -ls /hdfsapi/test
Found 1 items
-rw-r--r--   3 hadoop supergroup         14 2019-04-19 16:31 /hdfsapi/test/a.txt [hadoop@hadoop000 ~]$ hadoop fs -text /hdfsapi/test/a.txt Hello hadoop[hadoop@hadoop000 ~]$

创建文件并写入内容成功。

接着看更改文件名操作:

首先我们-ls查看到当前/hdfsapi/test目录下有a.txt和b.txt两个文件

[hadoop@hadoop000 sbin]$ hadoop fs -ls /hdfsapi/test
Found 2 items
-rw-r--r-- 3 hadoop supergroup 14 2019-04-19 16:31 /hdfsapi/test/a.txt
-rw-r--r-- 1 hadoop supergroup 28 2019-04-19 16:50 /hdfsapi/test/b.txt

我们使用fileSystem的rename方法,操作将b.txt重命名为c.txt

rename方法怎么使用?哪里不会Ctrl点哪里。点进去看到方法的源码介绍我们得知方法的功能是Renames Path src to Path dst(将路径SRC重命名为路径DST),两个参数是旧的Path和新的Path,返回值是布尔类型。

所以我们可以写:

    /*
* 测试文件名更改
*/
@Test
public void rename() throws Exception{
Path oldPath = new Path("/hdfsapi/test/b.txt");
Path newPath = new Path("/hdfsapi/test/c.txt");
Boolean result = fileSystem.rename(oldPath,newPath);
System.out.println(result);
}

运行之后打印出true,返回终端-ls查看,重命名成功。

[hadoop@hadoop000 sbin]$ hadoop fs -ls /hdfsapi/test
Found 2 items
-rw-r--r-- 3 hadoop supergroup 14 2019-04-19 16:31 /hdfsapi/test/a.txt
-rw-r--r-- 1 hadoop supergroup 28 2019-04-19 16:50 /hdfsapi/test/c.txt

【HDFS API编程】查看HDFS文件内容、创建文件并写入内容、更改文件名的更多相关文章

  1. 【HDFS API编程】jUnit封装-改写创建文件夹

    首先:什么是jUnit  回顾: https://www.cnblogs.com/Liuyt-61/p/10374732.html 上一节我们知道: /** * 使用Java API操作HDFS文件系 ...

  2. php学习笔记--高级教程--读取文件、创建文件、写入文件

    打开文件:fopen:fopen(filename,mode);//fopen("test.txt","r"): 打开模式:r  仅仅读方式打开,将文件指针指向 ...

  3. linux中为什么删除文件比创建文件要快,读取文件和删除文件的过程是什么?

    一.为什么删除文件比创建文件要快? 因为删除文件只是将bitmap位图表中将文件所占据的inode 和dacablock的使用状态从1变成0,相当于释放了这些快的使用权. 二.读取文件和删除文件的过程 ...

  4. 【HDFS API编程】第一个应用程序的开发-创建文件夹

    /** * 使用Java API操作HDFS文件系统 * 关键点: * 1)创建 Configuration * 2)获取 FileSystem * 3)...剩下的就是 HDFS API的操作了*/ ...

  5. 【HDFS API编程】查看目标文件夹下的所有文件、递归查看目标文件夹下的所有文件

    使用hadoop命令:hadoop fs -ls /hdfsapi/test  我们能够查看HDFS文件系统/hdfsapi/test目录下的所有文件信息 那么使用代码怎么写呢?直接先上代码:(这之后 ...

  6. 【HDFS API编程】从本地拷贝文件,从本地拷贝大文件,拷贝HDFS文件到本地

    接着之前继续API操作的学习 CopyFromLocalFile: 顾名思义,从本地文件拷贝 /** * 使用Java API操作HDFS文件系统 * 关键点: * 1)create Configur ...

  7. 【HDFS API编程】副本系数深度剖析

    上一节我们使用Java API操作HDFS文件系统创建了文件a.txt并写入了hello hadoop(回顾:https://www.cnblogs.com/Liuyt-61/p/10739018.h ...

  8. HDFS API编程

    3.1常用类        3.1.1Configuration Hadoop配置文件的管理类,该类的对象封装了客户端或者服务器的配置(配置集群时,所有的xml文件根节点都是configuration ...

  9. 【HDFS API编程】开发环境搭建

    使用HDFS API的方式来操作HDFS文件系统 IDEA Java 使用Maven来管理项目 先打开IDEA,New Project 创建GAV然后next 默认使用的有idea内置的Maven,可 ...

随机推荐

  1. SQL Server中的连接查询(内连接、外连接、交叉连接)

    在数据库查询中,经常会用到两个有关联的表进行查询,需要把两个表中的数据按照某些条件查出来,这时就可以使用连接查询 连接查询分为三种:内连接.外连接和交叉连接 1. 内连接 内连接inner join ...

  2. 让Entity Framework不再私闯sys.databases

    这里的“私闯sys.databases”是指Entity Framework默认发起的查询:SELECT Count(*) FROM sys.databases WHERE [name]=N'数据库名 ...

  3. 1130-Host '192.168.0.105' is not allowed to connect to this MySQL server的解决方案

    在CentOS 7服务器(192.168.0.118)上安装mysql5.7.17后,在本地(192.168.0.105)通过Navicat连接服务器上的MySQL报错,报错如图所示: Paste_I ...

  4. 软件开发者路线图梗概&书摘chapter1

    软件技能的概念 本书目的:尝试为软件开发的新颖方法整理出一份宣言 原因:定义泛化 从敏捷开发运动中学到的经验:理解支撑规则的底层因素 软件技能的愿景:价值的提取&希望的表达 价值体系: 1.基 ...

  5. rapid7/metasploitable3 CTF摘要

    rapid7/metasploitable3 俗话说,没图说个JB.我专门做了个图以供欣赏,做图技术可能有点糙,见谅见谅. 2016年11月,rapid7发布了metasploitable3,以后简称 ...

  6. 跳台阶(JAVA)

    跳台阶 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 思路:典型的动态规划问题,动态规划问题最关键的是把事件中的各种情形抽象为状态,然后找到前后 ...

  7. 游戏编程模式 Game Programming Patterns (Robert Nystrom 著)

    第1篇 概述 第1章 架构,性能和游戏 (已看) 第2篇 再探设计模式 第2章 命令模式 (已看) 第3章 享元模式 (已看) 第4章 观察者模式 (已看) 第5章 原型模式 (已看) 第6章 单例模 ...

  8. 解决Tomcat的IllegalArgumentException: Control character in cookie value or attribute错误

    接口中带有中文,tomcat8 17-Apr-2019 13:21:23.734 严重 [http-nio-8082-exec-2] org.apache.coyote.http11.Abstract ...

  9. H3C IRF MAD检测原理及相关问题验证

    一.IRF简介 IRF(Intelligent Resilient Framework,智能弹性架构)是H3C自主研发的软件虚拟化技术.它的核心思想是将多台设备通过IRF物理端口连接在一起,进行必要的 ...

  10. C# .NET MD5 HASH

    using System; using System.Security.Cryptography; using System.Text; namespace AAA { /// <summary ...