转自:使用java api操作HDFS文件,保存在此以学习。
全部程序如下:
-
importjava.io.IOException;
-
importjava.net.URI;
-
importjava.net.URISyntaxException;
-
-
importorg.apache.hadoop.conf.Configuration;
-
importorg.apache.hadoop.fs.FSDataInputStream;
-
importorg.apache.hadoop.fs.FSDataOutputStream;
-
importorg.apache.hadoop.fs.FileStatus;
-
importorg.apache.hadoop.fs.FileSystem;
-
importorg.apache.hadoop.fs.FileUtil;
-
importorg.apache.hadoop.fs.Path;
-
importorg.apache.hadoop.io.IOUtils;
-
-
-
publicclassHDFSTest{
-
-
-
publicstaticvoidWriteToHDFS(Stringfile,Stringwords)throwsIOException,URISyntaxException
-
{
-
Configurationconf=newConfiguration();
-
FileSystemfs=FileSystem.get(URI.create(file),conf);
-
Pathpath=newPath(file);
-
FSDataOutputStreamout=fs.create(path);
-
-
-
out.writeBytes(words);
-
out.write(words.getBytes("UTF-8"));
-
-
out.close();
-
-
-
-
-
}
-
-
publicstaticvoidReadFromHDFS(Stringfile)throwsIOException
-
{
-
Configurationconf=newConfiguration();
-
FileSystemfs=FileSystem.get(URI.create(file),conf);
-
Pathpath=newPath(file);
-
FSDataInputStreamin=fs.open(path);
-
-
IOUtils.copyBytes(in,System.out,4096,true);
-
-
-
-
-
-
-
-
-
-
-
}
-
-
publicstaticvoidDeleteHDFSFile(Stringfile)throwsIOException
-
{
-
Configurationconf=newConfiguration();
-
FileSystemfs=FileSystem.get(URI.create(file),conf);
-
Pathpath=newPath(file);
-
-
fs.delete(path,true);
-
fs.close();
-
}
-
-
publicstaticvoidUploadLocalFileHDFS(Stringsrc,Stringdst)throwsIOException
-
{
-
Configurationconf=newConfiguration();
-
FileSystemfs=FileSystem.get(URI.create(dst),conf);
-
PathpathDst=newPath(dst);
-
PathpathSrc=newPath(src);
-
-
fs.copyFromLocalFile(pathSrc,pathDst);
-
fs.close();
-
}
-
-
publicstaticvoidListDirAll(StringDirFile)throwsIOException
-
{
-
Configurationconf=newConfiguration();
-
FileSystemfs=FileSystem.get(URI.create(DirFile),conf);
-
Pathpath=newPath(DirFile);
-
-
FileStatus[]status=fs.listStatus(path);
-
-
for(FileStatusf:status)
-
{
-
System.out.println(f.getPath().toString());
-
}
-
-
Path[]listedPaths=FileUtil.stat2Paths(status);
-
for(Pathp:listedPaths){
-
System.out.println(p.toString());
-
}
-
}
-
-
publicstaticvoidmain(String[]args)throwsIOException,URISyntaxException
-
{
-
-
ListDirAll("hdfs://ubuntu:9000/user/kqiao");
-
-
StringfileWrite="hdfs://ubuntu:9000/user/kqiao/test/FileWrite";
-
Stringwords="Thiswordsistowriteintofile!\n";
-
WriteToHDFS(fileWrite,words);
-
-
ReadFromHDFS(fileWrite);
-
-
DeleteHDFSFile(fileWrite);
-
-
-
-
}
-
}
FSDataOutputStream os = hdfs.create(new Path(args[0]));
注意:在os.flush() 刷新数据流;
有时写入的文件不能立即被其他读者看见,只有大于一个块时其他读者才能看见第一个块,但还是不能看见当前块。可以使用out.sync() 强制所有缓存与数据节点同步。其实在每一个os.close()中隐含了一个sync()的调用