赞
踩
方式1:
API操作文件的增删改查
构造一个配置参数对象,设置一个参数:给出要访问的hdfs的URI
// 从而FileSystem.get()方法就知道应该是去构造一个访问hdfs文件系统的客户端,以及hdfs的访问地址
// newConfiguration();的时候,它就会去加载jar包中的hdfs-default.xml
// 然后再加载classpath下的hdfs-site.xml(可以从集群中拷贝一份,直接放到classpath下)
Configurationconf = new Configuration();
conf.set("fs.defaultFS","hdfs://hdp-node01:9000");
conf.set("dfs.replication","3");
// 获取一个hdfs的访问客户端,根据参数,这个实例应该是DistributedFileSystem的实例
// fs =FileSystem.get(conf);
/**
* 参数优先级: 1、客户端代码中设置的值 2、classpath下的用户自定义配置文件 3、然后是服务器的默认配置
*/
// 简写,就可以不要配"fs.defaultFS"参数,而且,这个客户端的身份标识已经是hadoop用户,其他参数还是设置在conf中
fs =FileSystem.get(new URI("hdfs://hdp-node01:9000"), conf,"hadoop");
—————————————————————————————————————————————
上传文件:
fs.copyFromLocalFile(new Path(src), new Path(dst));
下载文件:
fs.copyToLocalFile(new Path(src), new Path(dst));
创建目录:
fs.mkdirs(newPath(""));
删除文件夹:
fs.delete(newPath("/aaa"), true); //如果是非空文件夹,参数2必须给值true
重命名文件或文件夹:
fs.rename(newPath("/a1"), new Path("/a2")) 查看目录信息,只显示文件:
public void testListFiles() throws FileNotFoundException,IllegalArgumentException, IOException {
RemoteIterator<LocatedFileStatus>listFiles = fs.listFiles(new Path("/"), true);
while(listFiles.hasNext()) {
LocatedFileStatusfileStatus = listFiles.next();
System.out.println(fileStatus.getPath().getName());
System.out.println(fileStatus.getBlockSize());
System.out.println(fileStatus.getPermission());
System.out.println(fileStatus.getLen());
BlockLocation[]blockLocations = fileStatus.getBlockLocations();
for(BlockLocation bl : blockLocations) {
System.out.println("block-length:"+ bl.getLength() + "--" + "block-offset:" +bl.getOffset());
String[]hosts = bl.getHosts();
for(String host : hosts) {
System.out.println(host);
}
}
}
}
查看文件及文件夹信息:
public void testListAll() throws FileNotFoundException,IllegalArgumentException, IOException {
FileStatus[]listStatus = fs.listStatus(new Path("/"));
Stringflag = "d-- ";
for(FileStatus fstatus : listStatus) {
if(fstatus.isFile()) flag = "f-- ";
System.out.println(flag+ fstatus.getPath().getName());
}
}
方式2:
通过流的方式访问HDFS,更底层的操作。
上传文件:
FSDataOutputStream outputStream = fs.create(new Path("/filename),true);
FileInputStreaminputStream = new FileInputStream("c:/filename1);
IOUtils.copy(inputStream,outputStream);
下载文件:
FSDataInputStreamin = fs.open(new Path("/jdk-7u65-linux-i586.tar.gz"));
FileOutputStreamout = new FileOutputStream(new File("c:/jdk.tar.gz"));
IOUtils.copyBytes(in,out, 4096);
查看文件内容:
FSDataInputStream in = fs.open(newPath("/filename));
IOUtils.copyBytes(in, System.out, 1024);
在此过程可以随机定位,多个机器可以并发的所及读取HDFS文件指定位置的内容。
in.seek(22);//可以将流的起始偏移量进行自定义
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。