目录
一、简单JAVA知识
二、HDFS的JAVA api操作
三、我的学习代码
四、我的问题
一、简单JAVA知识
因为自己JAVA知识不咋滴,所以先总结一下HDFS的api操作中涉及的JAVA知识。先看个2个JAVA函数。
对于我来说主要为四点
1、程序入口方法public static void main(String[] args)
2、如何定义JAVA中的方法访问修饰符 返回值类型 方法名(参数列表)
public void show(){//无参无返回值的方法
System.out.printlin("hello world");
}
3、调用方法。先创建类的对象,然后通过 对象名.方法名()
HelloWorld hello = new HelloWorld();//创建类的对象
hello.sort(scores);// 对象名.方法名(),调用方法
4、Java的异常处理抛出以及自定义异常
异常处理里面有抛出异常,以及自定义异常。在IDEA或者eclipsec中都可以自动补全JAVA语法,然后我对这部分语法还不熟悉,多写多写代码,后面在复习,先把问题记录在这。
try-catch 以及try-catch-finally处理异常
try{
//一些会抛出异常的方法
}catch(exception e){
//处理该异常的代码块
}
如果try抛出异常将会发生什么勒?
终止执行,
程序的控制权将被移交给catch块中的异常处理程序
二、HDFS的JAVA api操作
HDFS的JAVA api操作中,主要包括创建文件夹、上传、下载文件、修改文件名。如果学习就该该部分即可。
//导入包
import org.apache.commons.io.IOUtils;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.conf.Configuration;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
public class Hdfs {
//----------------------------------------------------------------------------------
//一、JAVA入口
public static void main(String[] args) throws Exception{
//静态方法要调用非静态方法,需要通过对象访问非静态方法
Hdfs Hdfs = new Hdfs();
Hdfs.getFileSytem1();
Hdfs.getFilesySystme2();
Hdfs.listFiles();
// Hdfs.mkdirs(); //测试成功
// Hdfs.uploadFile();//测试成功
// Hdfs.downFile();//下载文件成功了
// Hdfs.downloadFile();
}
//----------------------------------------------------------------------------------
//二、创建文件夹
public void mkdirs() throws URISyntaxException, IOException, InterruptedException {
//1.获取FileSystem实例
FileSystem fileSystem = FileSystem.get(new URI("hdfs://bigdata02:9000"), new Configuration(), "root");
//2.创建文件夹
fileSystem.mkdirs(new Path("/aa/bb/cc"));//在什么路径下创建文件
//3.关闭Filesystem
fileSystem.close();
}
//--------------------------------------------------------------------------------------
//三、上传文件
public void uploadFile() throws URISyntaxException, IOException, InterruptedException {
//1.获取实例,获取HDFS抽象封装对象
//异常当你给别人写方法就可以抛异常,当你用别人的方法异常就要处理
//当用方法处理业务逻辑的时候异常全部都要处理
FileSystem fileSystem = FileSystem.get(new URI("hdfs://bigdata02:9000"), new Configuration(), "bigdata");
//2.上传文件,用这个对象操作文件系统
fileSystem.copyFromLocalFile(new Path("F://test0913.txt"),new Path("/file"));
//copyFromLocalFile两个参数源文件,目标文件地址
//3.关闭实例,关闭文件系统
fileSystem.close();
//用完之后一定要关,因为HDFS不支持并发写入。开着别人就写不了
}
//----------------------------------------------------------------------------------
//三、文件下载:使用copyToLocalFile
public void downloadFile() throws URISyntaxException, IOException {
//1.获取FileSystem
FileSystem fileSystem = FileSystem.get(new URI("hdfs://bigdata02:9000"), new Configuration());//alt+enter抛出异常
//2.调用方法,实现文件的下载
//注意设置false和true两个参数,否则在IDEA中直接运行报错:(null)entry in command string:null chmod 0644
fileSystem.copyToLocalFile(false,new Path("/wc.txt"),new Path("D://test2_down.txt"),true);
//3.关闭filesystem
fileSystem.close();
}
//----------------------------------------------------------------------------------
//四、文件重命名
public void rename() throws IOException, URISyntaxException, InterruptedException {
//1.创建实例
FileSystem fileSystem = FileSystem.get(new URI("hdfs://bigdata02:9000"),new Configuration(),"bigdata");
//2.用方法,实现文件重命名
fileSystem.rename(new Path("wcc.txt"),new Path("wc.txt"));
//3.关闭实例,关闭文件系统
fileSystem.close();
}
}
上面代码执行是成功的,如图
三、我的学习代码
大家如果学习的话,不用看该部分内容。因为我记得笔记比较乱。
import org.apache.commons.io.IOUtils;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.conf.Configuration;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
public class Hdfs {
/* public static void main(String[] args) {
System.out.println("tests");
}*/
public static void main(String[] args) throws Exception{
//静态方法要调用非静态方法,需要通过对象访问非静态方法
Hdfs Hdfs = new Hdfs();
// Hdfs.rename();
Hdfs.getFileSytem1();
Hdfs.getFilesySystme2();
// Hdfs.listFiles();
// Hdfs.mkdirs(); //测试成功
// Hdfs.uploadFile();//测试成功
// Hdfs.downFile();//下载文件成功了
// Hdfs.downloadFile();
}
//方式一:获取getFileSystme1
public void getFileSytem1() throws IOException{
//1、创建Configuration对象
Configuration conf = new Configuration();
//2、设置文件系统类型
conf.set("fs.defaultFS", "hdfs://bigdata02:9000");
//3、获取指定的文件系统
FileSystem fileSystem = FileSystem.get(conf);
//4、输出测试
System.out.println(fileSystem);
}
//方式二:获取getFileSystme2
public void getFilesySystme2() throws IOException{
//1.创建configuration对象
Configuration conf = new Configuration();
//2.设置文件系统类型
conf.set("fs.defaultFS", "hdfs://bigdata02:9000");
//3.获取指定的文件系统
FileSystem fileSystem = FileSystem.newInstance(conf);
//4.输出测试
System.out.println(fileSystem);
}
/**
* 方式三:new URI+get
* @throws Exception
*/
public void getFileSystem3() throws Exception{
FileSystem fileSystem = FileSystem.get(new URI("hdfs://hadoop0:9000"),
new Configuration());
System.out.println("fileSystem:" + fileSystem);
}
//文件的遍历
public void listFiles() throws URISyntaxException, IOException, InterruptedException {
//1.获取FileSystem实例
// public Configuration() {this(true); }
//public static FileSystem get(final URI uri, final Configuration conf,final String user)
//kFileSystem fileSystem = FileSystem.get(new URI(str:"hdfs://bigdata02:8020"),new Configuration(),user:"bigdata");
URI uri = new URI("hdfs://bigdata02:9000");
Configuration conf = new Configuration();
FileSystem fileSystem = FileSystem.get(uri, conf,"bigdata");
//Configuration对服务器要求的自定义配置,创建了一个对象fileSystem,要做什么事,就操作对象就行
//2.调用一个方法 listFiles方法
//public RemoteIterator<LocatedFileStatus> listFiles(final Path f, final boolean recursive)
RemoteIterator<LocatedFileStatus> iterator = fileSystem.listFiles(new Path("/"), true);
//3.遍历迭代
while (iterator.hasNext()){
LocatedFileStatus fileStatus = iterator.next();
//4.打印输出
System.out.println(fileStatus.getPath()+"====="+fileStatus.getPath().getName());
}
}
//创建文件夹
public void mkdirs() throws URISyntaxException, IOException, InterruptedException {
//1.获取FileSystem实例
FileSystem fileSystem = FileSystem.get(new URI("hdfs://bigdata02:9000"), new Configuration(), "root");
//2.创建文件夹
fileSystem.mkdirs(new Path("/aa/bb/cc"));//在什么路径下创建文件
//3.关键Filesystem
fileSystem.close();
}
//上传文件
public void uploadFile() throws URISyntaxException, IOException, InterruptedException {
//1.获取实例,获取HDFS抽象封装对象
//异常当你给别人写方法就可以抛异常,当你用别人的方法异常就要处理
//当用方法处理业务逻辑的时候异常全部都要处理
FileSystem fileSystem = FileSystem.get(new URI("hdfs://bigdata02:9000"), new Configuration(), "bigdata");
//2.上传文件,用这个对象操作文件系统
fileSystem.copyFromLocalFile(new Path("F://test0913.txt"),new Path("/file"));
//copyFromLocalFile两个参数源文件,目标文件地址
//3.关闭实例,关闭文件系统
fileSystem.close();
//用完之后一定要关,因为HDFS不支持并发写入。开着别人就写不了
}
//下载文件 通过输入输出流得方式下载文件
public void downFile() throws URISyntaxException, IOException, InterruptedException {
//1.获取filesystem实例
FileSystem fileSystem = FileSystem.get(new URI("hdfs://bigdata02:9000"), new Configuration(), "bigdata");
//2.获取HDFS的输入流
FSDataInputStream inputStream= fileSystem.open(new Path("/wc.txt"));
//3.获取本地路径的输出流
FileOutputStream outputStream = new FileOutputStream("D://test1_down.txt");
//4.文件的拷贝
IOUtils.copy(inputStream,outputStream);
//5.关闭流
IOUtils.closeQuietly(inputStream);
IOUtils.closeQuietly(outputStream);
fileSystem.close();
}
//文件下载:使用copyToLocalFile
public void downloadFile() throws URISyntaxException, IOException {
//1.获取FileSystem
FileSystem fileSystem = FileSystem.get(new URI("hdfs://bigdata02:9000"), new Configuration());//alt+enter抛出异常
//2.调用方法,实现文件的下载
//注意设置false和true两个参数,否则在IDEA中直接运行报错:(null)entry in command string:null chmod 0644
fileSystem.copyToLocalFile(false,new Path("/wc.txt"),new Path("D://test2_down.txt"),true);
//3.关闭filesystem
fileSystem.close();
}
//文件下载:使用copyToLocalFile2
public void downloadFile2(){
//1.获取FileSystem
FileSystem fileSystem = null;//alt+enter抛出异常
try {
fileSystem = FileSystem.get(new URI("hdfs://bigdata02:9000"), new Configuration());
} catch (IOException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
}
//2.调用方法,实现文件的下载
//注意设置false和true两个参数,否则在IDEA中直接运行报错:(null)entry in command string:null chmod 0644
try {
fileSystem.copyToLocalFile(false,new Path("/wc.txt"),new Path("D://test2_down.txt"),true);
} catch (IOException e) {
e.printStackTrace();
}
//3.关闭filesystem
try {
fileSystem.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
四、我的问题
1、不明白创建实例这一步,及中间的参数怎么看,不知道中间的实现过程。不知道为什么参数里面还可以new(这个是重点)
太傻勒,给我讲了一遍我还没有学会
FileSystem fileSystem = FileSystem.get(new URI("hdfs://bigdata02:9000"),new Configuration(),"bigdata");
2、在调用方法的时候,不知道参数应该怎么传,应该传什么参数。就是在构建fileSystem
时,不知道这个实例有哪些常用的方法,方法的参数是什么,以及在哪里看。
3、感觉自己应该了解下FileSystem包中,中常用的方法(也不知道自己专业术语说正确没有。
public boolean mkdirs(Path f) throws IOException {
return mkdirs(f, FsPermission.getDirDefault());
}
public void copyFromLocalFile(Path src, Path dst)
throws IOException {
copyFromLocalFile(false, src, dst);
}