方法一:第一种(在eclipse中,主要讲解环境)先进行依赖包引入,代码操作看方法二。
导包(在java中的jar包)流程如此下:
导入这两个包,这里就演示的包,common相同。
先导入这第三个还有它lib第三方依赖包的全部:
点击打开就导入了,下面也是。
这里就是导入成功了(hdfs和hdfsbao包一样的,举个例子,我这里是hdfs,名字随便取):
方法二(一):IO流的操作(idea中)
首先就是建一个maven项目(都学到大数据了,这个要会哦):
然后找到网站上找依赖包。
网站如下:依赖包获得链接
接下来就是获得下面的两个的依赖包(我两个依赖都是要的2.6.5版本,因为自己的hadoop就是2.6.5的版本,以自己安装的版本为主):点进去自己找。
下面找common为例,hdfs一样的操作:
找到两个依赖之后,放进去maven里去(看图):
接下来就是创建java类进行操作:
package xiaoi;
import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.junit.Before;
import org.junit.Test;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
public class HdfsTest {
FileSystem fileSystem;
@Before
public void init() throws Exception {
fileSystem = FileSystem.get(new URI("hdfs://192.168.71.200:9000"),new Configuration(),"root");
}
/**
* 对数据库的文件流的文件操作
* @throws IOException
*/
@Test
public void testseek () throws IOException {
FSDataInputStream in =fileSystem.open(new Path("/1.text"));
//读取文件六个字节的内容
in.seek(6);
FileOutputStream out = new FileOutputStream("D://hdfs.txt");
IOUtils.copyBytes(in,out,4096);
//关闭资源流
IOUtils.closeStream(in);
IOUtils.closeStream(out);
}
/**
* 以文件流的形式从hdfs中复制文件到本地磁盘
* @throws IOException
*/
@Test
public void TestDownLoad() throws IOException {
FSDataInputStream in =fileSystem.open(new Path("/jdk1.8.0_172/bin/jar"));
//写入的文件可以没有,系统会自己创建与之相同的文件进行操作。
FileOutputStream out = new FileOutputStream("D:/jdk.tgz");
IOUtils.copyBytes(in,out,new Configuration());
IOUtils.closeStream(in);
IOUtils.closeStream(out);
}
/**
* 以文件流的形式从hdfs中复制文件到本地磁盘
* @throws IOException
*/
@Test
public void testUpload() throws IOException {
//获得本地输入流
FileInputStream in = new FileInputStream("D:/jdk.tgz");
//获得hdfs的输出流
FSDataOutputStream Out = fileSystem.create(new Path("/jdk.tar.gz"));
IOUtils.copyBytes(in, Out,4096);
//关闭字符流
IOUtils.closeStream(in);
IOUtils.closeStream(Out);
}
}
结果展示(test中方法一):
结果展示(test中方法二):
拷贝到本地就是这个样子:
结果展示(test中方法三):
方法二(二):简单文件的操作(idea中)
话不多说,直接上代码,一目了然:
package xiaoi;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
public class HdfsUtil {
FileSystem fileSystem = null;
@Before
public void init() throws Exception {
fileSystem = FileSystem.get(new URI("hdfs://192.168.71.200:9000"), new Configuration(), "root");
}
/**
* 从hdfs中下载文件到本地
*/
@Test
public void downLoad() throws IllegalArgumentException, IOException {
fileSystem.copyToLocalFile(false,new Path("/1.text"),new Path("d:/"),true);
fileSystem.close();
}
/**
* 对文件夹的操作
* @throws Exception
*/
@Test
public void testDir() throws Exception {
boolean mkdirs = fileSystem.mkdirs(new Path("/aaa"));
System.out.println("创建了一个文件夹");
boolean exists = fileSystem.exists(new Path("/aaa"));
System.out.println("文件夹是否存在:"+exists);
fileSystem.copyFromLocalFile(new Path("d:/person.sql"),new Path("/aaa"));
System.out.println("成功上传一个文件到/aaa下");
// fileSystem.delete(new Path("/aaa"),true);
// System.out.println("已经把文件删除");
fileSystem.close();
}
/**
* 对文件信息的查看
* @throws Exception
*/
@Test
public void testFileStutas() throws Exception {
//只能列出“文件”信息
RemoteIterator<LocatedFileStatus> locatedFileStatusRemoteIterator = fileSystem.listFiles(new Path("/"), true);
//判断是否为空
while (locatedFileStatusRemoteIterator.hasNext()){
//依次遍历下一个
LocatedFileStatus next = locatedFileStatusRemoteIterator.next();
System.out.println(next);
}
System.out.println("--------------------------------------------------------");
FileStatus[] fileStatuses = fileSystem.listStatus(new Path("/"));
for (FileStatus fileStatus : fileStatuses) {
String type = "-";
if(fileStatus.isDirectory()){
type = "d";
}
System.out.println(type+"\t"+fileStatus.getPath().getName());
}
}
/**
* 查看hdfs的文件的块信息
* @throws Exception
*/
@Test
public void testBLokInfo() throws Exception {
BlockLocation[] fileBlockLocations = fileSystem.getFileBlockLocations(new Path("/jdk.tar.gz"), 0, 143588167);
for (BlockLocation fileBlockLocation : fileBlockLocations) {
//获得切割块的位置
System.out.println(fileBlockLocation.getOffset());
//获得存储在第一个块存储的位置的主机ip
System.out.println(fileBlockLocation.getNames()[0]);
}
//修改文件名:第一个参数是原来文件的名字,第二个参数是改后的文件的名字。
// fileSystem.rename(new Path("/jdk.tar.gz"),new Path(""));
//设置文件的块存贮量,也就是分几块备份;
// fileSystem.setReplication(new Path("/文件的名字"),(short)2);
}
}
downLoad()方法的结果展示:
testDir()方法结果展示:
testFileStutas()方法结果展示:
testBLokInfo()方法结果展示:
至此,简单的java操作hadoop的hdfs文件两种方式就已经展示完了,读者可以按照步骤进行操做一遍。