在java中获取文件的完整路径

ant*_*ant 8 java

当我传递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().

更新:现在你发布了代码,我可以想办法改进它:

  • 您可以使用FilenameFilter来查找所需的文件,
  • 请注意listlistFiles返回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.

  • 彼得我必须明确这样说,我认为这是我得到的最好的答案之一,你的MyFilter课程建议减少了如此多的代码,只是令人惊叹.非常感谢你 (2认同)