hadoop_hdfs03-java-IO流操作
注:仅作笔记.
api操作是hdfs系统封装好的,如果想自己实现api操作,可以使用IO流的方式实现数据的上传和下载.
-
hdfs文件上传
-
hdfs文件下载
-
指定下载起始位置
package com.onhadoop.hdfs;
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.Test;
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 java.sql.SQLOutput;
/*
api操作是hdfs系统封装好的,如果想自己实现api操作,可以使用IO流的方式实现数据的上传和下载
*/
public class HDFSIO {
/**
* tartget1:把本地txt文件上传到hdfs
*/
@Test
public void putFileToHdfs() throws URISyntaxException, IOException, InterruptedException {
// 1.获取文件系统
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"),conf,"user02");
// 2.获取输入流 源端:本地
// FileInputStream fis = new FileInputStream(new File("/Users/linux01/Desktop/fromHdfs.txt")) ;
FileInputStream fis = new FileInputStream(new File("/Users/linux01/Documents/hadoop-2.7.2.zip")) ;
// 3.获取输出流 目的端:hdfs
FSDataOutputStream fos = fs.create(new Path("/IO/hadoop-2.7.2.zip"));
// 4.流的对烤
IOUtils.copyBytes(fis,fos,new Configuration());
// 5.关闭流
IOUtils.closeStream(fis);
IOUtils.closeStream(fos);
fs.close();
}
/**
* target2:文件的下载
* @throws URISyntaxException
* @throws IOException
* @throws InterruptedException
*/
@Test
public void loadFilefromHdfs() throws URISyntaxException, IOException, InterruptedException {
// 1.获取文件系统
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), conf, "user02");
// 2.获取输入流
// 源端:hdfs
FSDataInputStream fis = fs.open(new Path("/IO/iphh.txt"));
// 3.获取输出流
// 目的端:本地
FileOutputStream fos = new FileOutputStream(new File("/Users/linux01/Desktop/iohhh.txt"));
// 4.流的对烤
IOUtils.copyBytes(fis,fos,new Configuration());
// 5.关闭流和文件系统
IOUtils.closeStream(fis);
IOUtils.closeStream(fos);
fs.close();
}
/**
* target3:分块下载hdfs上的大文件
* 3.1 下载第一块:遍历
* 3.2 下载第二块:指定位置开始读
*/
// 3.1
@Test
public void readFileSeek1() throws URISyntaxException, IOException, InterruptedException {
// 1.获取文件系统
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), conf, "user02");
// 2.获取输入流
FSDataInputStream fis = fs.open(new Path("/IO/hadoop-2.7.2.zip"));
// 3.获取输出流
FileOutputStream fos = new FileOutputStream(new File("/Users/linux01/Desktop/hadoop-2.7.2.zip.part1"));
// 4.流的拷贝(*)
byte[] buf = new byte[1024];
for (int i=0 ; i < 1024 * 128; i++){
fis.read(buf);
fos.write(buf);
}
// 5.关闭流和文件系统
IOUtils.closeStream(fis);
IOUtils.closeStream(fos);
fs.close();
}
//3.2
@Test
public void readFileSeek2() throws URISyntaxException, IOException, InterruptedException {
// 1.获取文件系统
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://hadoop102:9000"), conf, "user02");
// 2.获取输入流
FSDataInputStream fis = fs.open(new Path("/IO/hadoop-2.7.2.zip"));
// 定位输入流读取的位置,单位byte(*)
fis.seek(1024*1024*128); //
// 3.获取输出流
FileOutputStream fos = new FileOutputStream(new File("/Users/linux01/Desktop/hadoop-2.7.2.zip.part2"));
// 4.流的拷贝
IOUtils.copyBytes(fis,fos,new Configuration());
// 5.关闭流和文件系统
IOUtils.closeStream(fis);
IOUtils.closeStream(fos);
fs.close();
}
/*
查看结果在本地执行:cat hadoop-2.7.2.zip.part2 >> hadoop-2.7.2.zip.part1
*/
}