hadoop学习记录(二)HDFS java api
FSDateinputStream 对象
FileSystem对象中的open()方法返回的是FSDateInputStream对象,改类继承了java.io.DateInoutStream接口。支持随机访问
Seekable接口
支持在文件中找到指定位置,并提供一个查询当前位置相对于文件起始位置偏移量的查询方法。
public interface Seekable{ //seek()可以移到文件中任意一个绝对位置 void seek(long pos); long getPos(); boolean seekToNewSource(long targetPos); }
需要注意的是:seek()方法是一个相对高开销的操作,需要慎重使用。如要访问文件,还是用流数据如MapReduce,而不是大量的seek()!
写入数据
FIleSystem有新建文件夹的方法
- public FSDaateOutputStream create(path f);该方法指定一个path对象,如果不存在则自动创建有时候我们希望文件夹不存在时就报出失败而不是创建完写入,这时就需要先调用exists()来判断。
- 另一个方法是append(),允许在一个已有文件的末尾追加数据
- progress()方法用于传递回调接口,可以通知应用数据写入datenode的进度。
1 String localSrc = args[0]; 2 String dst = args[1]; 3 //获取文件读取流 4 InputStream in = new InputStream(new FileInputStream(localSrc)); 5 6 Configuration conf = new Configuration(); 7 FileSystem fs = FileSystem.get(URI.create(dst),conf); 8 OutputStream out = fs,create(new Path(dst),new Progressable(){ 9 public void progress(){ 10 Syso.("running!") 11 } 12 });
FSDataOutputStream对象
该对象不允许在写入文件时定位,只能顺序写入,追加在文件末尾。
FileStatus对象
用FIleSystem.getFileStatus()方法可以返回一个文件的信息和状态。包括文件长度,块大小,副本,修改时间,所有者及权限。