当我传递File file给一个方法时,我试图获得它的完整路径,就像file.getAbsolutePath();我总是得到相同的结果,无论我使用绝对路径或规范路径哪一个PATH_TO_MY_WORKSPACE/projectName/filename并不存在,我怎样才能获得文件的确切位置?
谢谢
细节:
这是一些代码和这个解决方案(它很糟糕,但它的工作):
private static void doSomethingToDirectory(File factDir) throws IOException {
File[] dirContents = factDir.listFiles();
if(factDir.isDirectory() && dirContents.length > 0){
for (int i = 0; i < dirContents.length; i++) {
for (String str : dirContents[i].list()) {
if(str.equals(TEMP_COMPARE_FILE)){
process(new File(dirContents[i].getAbsolutePath() + "\\" + str));
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在循环使用factDir所在的目录src/main,我正在寻找仅仅是TEMP_COMPARE_FILE值的BeProcessed.txt文件,我将它们发送到读取文件并处理它的进程方法.
如果有人能够更好地解决问题我会很高兴
Pét*_*rök 13
来自Javadoc的引用可能会有所帮助:
路径名,无论是抽象的还是字符串形式,可以是绝对的或相对的.绝对路径名是完整的,因为不需要其他信息来定位它表示的文件.相反,相对路径名必须根据从其他路径名获取的信息来解释.默认情况下,
java.io程序包中的类始终解析当前用户目录的相对路径名.此目录由系统属性命名user.dir,通常是调用Java虚拟机的目录.
我解释这一点,如果你创建你的File对象的new File("filename")地方filename是相对路径,即使通过调用,该路径也不会转换为绝对路径file.getAbsolutePath().
更新:现在你发布了代码,我可以想办法改进它:
list并listFiles返回null非目录对象,因此我们需要额外检查,listFiles()在内循环中再次使用,从而避免了File使用手工组装路径创建新对象的需要.(顺便说一下,\\手动附加到路径是不可移植的;正确的方法是使用File.separator).最终的结果是
private static void doSomethingToDirectory(File factDir) throws IOException {
if (factDir.isDirectory()) {
for (File file : factDir.listFiles()) {
if (file.isDirectory()) {
for (File child : file.listFiles(new MyFilter())) {
process(child);
}
}
}
}
}
class MyFilter implements FilenameFilter {
public boolean accept(File dir, String name) {
return name.equals(TEMP_COMPARE_FILE);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,此代码模仿原始代码的行为,就像我理解的那样; 最值得注意的是,它只在非递归的直接子目录中找到具有正确名称的文件factDir.