利用Java接口对HDFS进行读写操作
2017-01-05 00:00
661 查看
1. 从HDFS中读取文件内容
使用URL
System.out, 4096, false); } finally{ IOUtils.closeStream(in); } }}
有时无法在应用中设置URLStreamHandlarFactory实例,例如不受控制的第三方组件如果已经声明了一个URLStreamHandlerFactory实例,你将无法再使用上述方法从Hadoop中读取数据,这种情况下,需要使用FileSystem
API来打开一个文件的输入流。
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import java.io.InputStream;
/**
* Created by zhangyan on 2017/1/5.
*/
/**
* Hadoop的Filesystem类就是与Hadoop的某一文件系统进行交互的 APl,
* Filesystem类是一个抽象类,是需要被继承的,所以只能通过get方法得到具体的类
*
* FileSystem是一个通用的文件系统API,所以第一步是检索需要使用的文 件系统实例,这里是HDFS
*/
public class FileSystemCat {
public static void main(String[] args) throws Exception {
String uri = args[0];
Configuration conf = new Configuration();
//以下两句定义FileSystem对象的方法都可以读取HDFS内文件的内容
//FileSystem fs = FileSystem.get(URI.create(uri), conf);
FileSystem fs = FileSystem.get(conf);
//创建目录
fs.mkdirs(new Path("hdfs://myhadoop/apiPath"));
InputStream in = null;
try {
//调用open()函数来获取文件的输入流
in = fs.open(new Path(uri));
IOUtils.copyBytes(in, System.out, 4096, false);
} finally {
IOUtils.closeStream(in);
}
}
}
2. 向HDFS中写入数据
3. Delete HDFS中的Path
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
/**
* Created by zhangyan on 2017/1/4.
*/
public class MyUtils {
public static void deleteDir(Configuration conf, String dirPath) throws IOException{
FileSystem fs=FileSystem.get(conf);
Path target=new Path(dirPath);
//判断Path对象在FileSystem中是否存在
if(fs.exists(target)){
//删除路径
// 如果是directory的话,第二个参数为true则删除文件夹及其包含的文件,为false则抛异常
4000
// 如果是文件的话,第二个参数为true或false都可以。。
boolean delResult = fs.delete(target,true);
if(delResult){
System.out.println(target + " has been deleted sucessfullly.");
} else {
System.out.println(target + " deletion failed.");
}
}
}
}
4. FileStatus,包含了文件元信息
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
/**
* Created by zhangyan on 2017/1/5.
*/
public class TestFileStatus {
public static void main(String[] args) throws IOException{
Configuration conf=new Configuration();
FileSystem fs = FileSystem.get(conf);
FileStatus fstat= fs.getFileStatus(new Path(args[0]));
System.out.println(fstat.getAccessTime());
System.out.println(fstat.getBlockSize());
System.out.println(fstat.getLen());
System.out.println(fstat.getReplication());
System.out.println(fstat.getOwner());
}
}
使用URL
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory; import org.apache.hadoop.io.IOUtils; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; /** * Created by zhangyan on 2017/1/4. */ public class URLCat {
/** * 要从Hadoop文件系统中读取文件,最简单的方法是使用java.net.URL对象打开数据流,进而从中读取数据 * 要让Java程序能够识别Hadoop的hdfs URL, * 需要采用的方法是 FsUrlStreamHandlerFactory实例作为URL中setURLStreamHandlerFactory方法的参数。 * 由于Java虚拟机只能调用一次上述方法,因此通常在静态方法 中调用上述方法。 * * 没有以下的static块中的内容,会报出异常 java.net.MalformedURLException: unknown protocol: hdfs */static{ URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory()); } public static void main(String[] args) throws MalformedURLException,IOException{ InputStream in=null; try{ in = new URL(args[0]).openStream(); IOUtils.copyBytes(in,
System.out, 4096, false); } finally{ IOUtils.closeStream(in); } }}
有时无法在应用中设置URLStreamHandlarFactory实例,例如不受控制的第三方组件如果已经声明了一个URLStreamHandlerFactory实例,你将无法再使用上述方法从Hadoop中读取数据,这种情况下,需要使用FileSystem
API来打开一个文件的输入流。
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import java.io.InputStream;
/**
* Created by zhangyan on 2017/1/5.
*/
/**
* Hadoop的Filesystem类就是与Hadoop的某一文件系统进行交互的 APl,
* Filesystem类是一个抽象类,是需要被继承的,所以只能通过get方法得到具体的类
*
* FileSystem是一个通用的文件系统API,所以第一步是检索需要使用的文 件系统实例,这里是HDFS
*/
public class FileSystemCat {
public static void main(String[] args) throws Exception {
String uri = args[0];
Configuration conf = new Configuration();
//以下两句定义FileSystem对象的方法都可以读取HDFS内文件的内容
//FileSystem fs = FileSystem.get(URI.create(uri), conf);
FileSystem fs = FileSystem.get(conf);
//创建目录
fs.mkdirs(new Path("hdfs://myhadoop/apiPath"));
InputStream in = null;
try {
//调用open()函数来获取文件的输入流
in = fs.open(new Path(uri));
IOUtils.copyBytes(in, System.out, 4096, false);
} finally {
IOUtils.closeStream(in);
}
}
}
2. 向HDFS中写入数据
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; import java.io.*; import java.net.URI; /** * Created by zhangyan on 2017/1/4. */ public class FileCopyToHDFS { public static void main(String[] args) throws IOException{ String localSrc = args[0]; String dst = args[1]; InputStream in=new BufferedInputStream(new FileInputStream(localSrc)); Configuration conf=new Configuration(); //创建FileSystem对象。可以使用URI,也可以不使用URI //FileSystem fs=FileSystem.get(URI.create(dst),conf); FileSystem fs=FileSystem.get(conf); // 创建写入数据的输出流 // 给准备创建的文件指定一个Path对象 // create()方法能够为需要写入且当前不存在的文件创建父目录 OutputStream out=fs.create(new Path(dst)); IOUtils.copyBytes(in, out, 4096, true); } }
3. Delete HDFS中的Path
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
/**
* Created by zhangyan on 2017/1/4.
*/
public class MyUtils {
public static void deleteDir(Configuration conf, String dirPath) throws IOException{
FileSystem fs=FileSystem.get(conf);
Path target=new Path(dirPath);
//判断Path对象在FileSystem中是否存在
if(fs.exists(target)){
//删除路径
// 如果是directory的话,第二个参数为true则删除文件夹及其包含的文件,为false则抛异常
4000
// 如果是文件的话,第二个参数为true或false都可以。。
boolean delResult = fs.delete(target,true);
if(delResult){
System.out.println(target + " has been deleted sucessfullly.");
} else {
System.out.println(target + " deletion failed.");
}
}
}
}
4. FileStatus,包含了文件元信息
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
/**
* Created by zhangyan on 2017/1/5.
*/
public class TestFileStatus {
public static void main(String[] args) throws IOException{
Configuration conf=new Configuration();
FileSystem fs = FileSystem.get(conf);
FileStatus fstat= fs.getFileStatus(new Path(args[0]));
System.out.println(fstat.getAccessTime());
System.out.println(fstat.getBlockSize());
System.out.println(fstat.getLen());
System.out.println(fstat.getReplication());
System.out.println(fstat.getOwner());
}
}
相关文章推荐
- 黑马程序员--Java基础加强--15.利用反射操作泛型IV【通过反射Method解析泛型方法思路】【通过Method对四种Type子接口类型进行解剖】【使用递归对任意复合泛型类型进行彻底解剖】【个人
- 利用java对excel进行读写操作
- 利用hdfs的java api进行文件操作注意事项
- java中IO操作 利用文件流 过滤流对文件进行读写操作
- java中IO操作 利用文件流 过滤流对文件进行读写操作
- java中IO操作 利用文件流 过滤流对文件进行读写操作
- 利用JDK7的NIO2.0进行I/O读写和文件操作监控
- 黑马程序员--Java基础加强--12.利用反射操作泛型I【与反射+泛型相关的接口类型综述】【Type】【ParameterizedType】【个人总结】
- java 借助jxl进行excel数据的读写操作
- Java学习之路——利用JDOM对xml文档进行解析等操作实例
- HDFS的java接口——简化HDFS文件系统操作
- 利用ADO连接ACCESS数据库,并进行读写操作(MFC)
- 利用JDK7的NIO2.0进行I/O读写和文件操作监控
- 利用JDK7的NIO2.0进行I/O读写和文件操作监控
- java进行文件读写操作详解
- 利用java的可序列化IO流仿数据库原理进行CRUD操作。
- 黑马程序员--Java基础加强--17.利用反射操作泛型VI【泛型类型变量的语义】【GenericDeclaration接口】【泛型接口TypeVariable】【通过Class反射解析泛型类】
- Java 如何对文件进行多个Object对象流的读写操作
- 利用POI对MS Excel进行读写(可以设置写入文件的样式),利用tm-extractor对Word进行读取操作并将信息用(log4j)日志信息显示出
- 利用javacsv.jar 读写CSV的简单操作