在hdfs 目录下上传文件
(上传一个hadoop-2.7.7.tar.gz安装包)
要求:
(1)以Java API方式写代码完成文件夹创建;
(2)以Java API文件流的方式完成hadoop-2.7.7.tar.gz文件的上传;
package hadoop;
//多个文件
//一个文件多个文件块,一个块放在多个host上
//三级循环
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.apache.hadoop.io.IOUtils;
/**
*
* hdfs常用api
*/
public class HDFSAPITest {
public static void main(String[] args) throws IOException, InterruptedException, URISyntaxException {
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop01:9000"), conf, "hadoop01");
// 创建文件夹/data
Path path = new Path("/data");
// 文件是否存在
boolean b = fs.exists(path);
if (!b) {
fs.mkdirs(path);
}
// //删除文件夹的操作
// fs.delete(path);
// fs.deleteOnExit(path);
// fs.delete(path, true);
// 获取指定目录下的文件列表 只能获取文件列表,获取不到文件夹 shift+Ctrl+L
RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(path, false);
// 遍历迭代器
while (listFiles.hasNext()) {
LocatedFileStatus next = listFiles.next();
System.out.println(next.getPath());
System.out.println(next.getReplication());
// 返回每一个文件的块信息,数组长度代表块的个数,每一个块代表数组中的一个元素
BlockLocation[] blockLocations = next.getBlockLocations();
for (BlockLocation bl : blockLocations) {
System.out.println(bl);
System.out.println("block size=" + bl.getLength());
}
}
// 获取指定目录下的文件状态信息
FileStatus[] listStatus = fs.listStatus(new Path("/"));
for (FileStatus fst : listStatus) {
System.out.println(fst);
System.out.println(fst.isDirectory());
System.out.println(fst.isFile());
System.out.println(fst.getBlockSize());
}
// 流的形式上传/下载 IOUtils工具类
//文件上传:本地(输入流)普通的java输入流-----hdfs(输出流)
FileInputStream in = new FileInputStream(new File("D:\\hadoop-2.7.7.tar.gz"));//本地windows系统的文件路径
FSDataOutputStream out = fs.create(new Path("/data/package")); // 必须指定hdfs目录一个文件,如果没有可以先建
IOUtils.copyBytes(in, out, 4096);
// 文件下载:hdfs(输入流)----本地(输出流)
FSDataInputStream fsin = fs.open(new Path("/data/package"));
FileOutputStream fsout = new FileOutputStream(new File("D:\\"));
IOUtils.copyBytes(fsin, fsout, 4096);
// IOUtils操作完会自动关闭流,不用再执行 in.close() 和 out.close()
}
}