FSDataInputStream实现了Seekable接口
实现方法:
其中的seek(long pos)方法可以 ,对任意位置进行重新定位,与java.io.inputstream中的skip()不同。
举个例子对,hdfs中的一个文件进行两次输出:
文件中内容如下:
在Eclipse中创建一个类对数据进行读取:
package test01;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
public class test01 {
public static void main(String[] args) throws Exception {
Configuration conf=new Configuration();
URI uri=new URI("hdfs://192.168.137.133:8020");
FileSystem fs=FileSystem.get(uri, conf);
FSDataInputStream in= fs.open(new Path("/a.txt"));
System.out.println("1.当前所在位置:"+in.getPos());
System.out.println("2.输出内容:");
IOUtils.copyBytes(in, System.out, in.available());
System.out.println("3.此时所在位置:"+in.getPos());
System.out.println("...........................................");
System.out.print("4.重新定位:");
System.out.println("...........................................");
in.seek(0);
System.out.println("获取当前位置:"+in.getPos());
System.out.println("第二次内容输出:");
IOUtils.copyBytes(in, System.out, in.available());
System.out.println("获取当前位置:"+in.getPos());//获取当前位置
System.out.println("完成!");
in.close();
fs.close();
}
}
控制台输出结果: