我正在编写一个Java类来创建一个HDFS目录,但我想在创建目录之前检查该目录是否存在。我不确定是使用Path.getFileSystem()还是FileSystem.get():
Configuration conf = new Configuration();
Path path = new Path(args[1]);
FileSystem fs = path.getFileSystem(conf);
if(fs.exists(path)) {
System.err.println("Dir already exists");
}
boolean status = fs.mkdirs(path);
或者我应该使用FileSystem.get()方法:
Configuration conf = new Configuration();
Path path = new Path(args[1]);
FileSystem fs = FileSystem.get(conf);
boolean status = fs.mkdirs(path);
if(!status) {
System.err.println("Dir already exists");
}
何时适合使用以下任一项:是文件系统路径.getFileSystem()还是文件系统.get()?
2条答案
按热度按时间hfsqlsce1#
这取决于您是否已经有一个非空的
Path
对象。空值安全的方法是将
Configuration
对象与静态方法FileSystem.get(conf)
一起使用cxfofazt2#
如果您有多个名称空间,则建议使用path.getFileSystem(conf);
FileSystem.get(conf)将始终返回默认值文件系统
**path.getFileSystem(conf)**将返回与指定路径相关的文件系统,
如果它是完整路径(例如hdfs://haservice 2/dir 1),并且默认命名空间是hdfs://haservice 1****FileSystem。get(conf)会将FS返回到hdfs://haservice 1和path。getFileSystem(conf)会将FS wrt路径返回到hdfs://haservice 2/,因此对该路径的FS调用将成功,如果我们使用来自FileSystem.get(conf)的FS,则不会出现这种情况。
如果路径不包含方案和权限(例如,只有/dir),则路径.getFileSystem(conf)和FileSystem.get(conf)的行为相同。它们都将返回由Fs.defaultFsconfig指定的默认文件系统。
在代码方面,path.getFileSystem(conf)也只使用解析的URI调用FileSystem.get(..)。