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

8
当我把 File file 传递给一个方法时,我试图获取它的完整路径,就像这样 file.getAbsolutePath(); 无论我使用哪个,无论是 absolute 还是 canonical path 都会得到相同的结果 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));
                        }
                    }
                }           
            }
        }

我正在遍历目录,其中factDir为src/main,我只寻找名为toBeProcessed.txt的文件,且其值为TEMP_COMPARE_FILE,然后将它们发送到处理方法中,该方法读取文件并进行处理。
如果有更好的解决方案,我将不胜感激。

1
你确定它不在那里吗?你刷新了文件树吗?(如果使用Eclipse ;)) - RoflcoptrException
你是如何创建那个文件对象的? - Péter Török
@Sebi 当然了,我做过了。@Peter 是的,我做过了 :) - ant
3
据我所知,“是”不是对我的问题一个合适的回答 :-/ - Péter Török
3
在我看来,你只是实例化了一个文件对象,但除非你使用Writer或Outputstream写入文件,或调用“createNewFile()”,否则并不会在磁盘上创建任何内容。 - Greg Case
显示剩余5条评论
2个回答

14

这个来自Javadoc的引用可能会有所帮助:

路径名(无论是抽象的还是字符串形式的)可以是绝对的也可以是相对的。绝对路径名是完整的,因为不需要其他信息即可定位它所表示的文件。相反,必须根据从某些其他路径名中取得的信息来解释相对路径名。默认情况下,java.io包中的类总是针对当前用户目录解析相对路径名。该目录由系统属性user.dir指定,通常是Java虚拟机被调用时的目录。

我理解的是,如果您使用相对路径创建File对象,例如new File("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);
  }
}
请注意,这段代码尽可能地模仿了您原来的代码行为,特别是它只在factDir的直接子目录中查找具有适当名称的文件,并且不进行递归搜索。

2
哇,Peter,我必须得说,这是我在SO上收到的最好的答案之一。你的MyFilter类建议减少了很多代码,真是太棒了。非常感谢! - ant

2

如果文件在程序目录中,我认为有一种方法可以帮助你。

首先,你需要通过以下方式获取程序目录:

new File(".").getCanonicalPath()

那么:

如果file在特定的目录中,比如folder\\filename 完整路径将会是

(new File(".").getCanonicalPath() + "\\folder\\filename")

如果file直接在程序目录中:

完整路径将是:
(new File(".").getCanonicalPath() + "\\filename")

我希望这个答案能够帮到您 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接