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

/**
 * 使用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. PTA——近似求PI

    PTA 7-50 近似求PI 网友代码: include <stdio.h> int main(){ , i, temp=; scanf("%le", &eps ...

  2. xshell 使用命令上传、下载文件

    打开xshell, ①检查是否已经安装了上传下载的命令,#rpm -qa |grep lrzsz [root@mjy logs]# rpm -qa |grep lrzszlrzsz-0.12.20-2 ...

  3. Node.Js http服务(websocket)

    安装node,下载地址 https://nodejs.org/en/ cmd 中 输入 node -v 安装成功可以查看版本 cmd 中 ctrl - c 可以 结束 和 启动 编辑 js 文本 va ...

  4. AGC002 F - Leftmost Ball

    貌似哪里讲过这题..总之当时掉线了(理解能力又差水平又低选手的日常).. 看看题目,应该是DP. 尝试了几次换状态,毫无思路.那我们就来继续挖掘性质吧...为了更直观,我们令第i个出现的球颜色就是i( ...

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

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

  6. 网络操作基础(two)

    P106 一.什么是活动目录?活动目录有哪些优点? 二.什么是域.域树.森林? 三.什么是信任?什么是域的方向及传递性? 四.如何管理活动目录的信任与站点? 解答! (一) 1.活动目录:提供了用于存 ...

  7. Python基础:七、注释

    有时候我们写的东西不一定都是给用户看的,或者不希望解释器执行(方便自己,方便他人),我们可以使用#来注释掉代码被注释的内容是不会执行的,可以方便后面的程序员来拜读你的代码. 1. 单行注释:#被注释的 ...

  8. gtest 参数化

    前言: 在测试用例中,我们时常需要传给被测函数不同的值,gtest为我们提供了简便的方法,可以使我们能够灵活的进行参数化测试. 步骤: 1.创建一个类,继承testing::TestWithParam ...

  9. 【linux日常】 ACL权限管理

    ACL ((Access Control Lists) setfacl命令 这里引用一个非常详细的命令介绍. 要点: getfacl -R        递归获取acl权限,可以存储为文件以备还原 g ...

  10. Pac-Man 吃豆人

    发售年份 1980 平台 街机 开发商 南梦宫(Namco) 类型 迷宫 https://www.youtube.com/watch?v=dScq4P5gn4A