当我将File file
传递给某个方法时,我正试图获得像file.getAbsolutePath();
这样的完整路径,无论我使用绝对路径还是规范路径,我都会得到相同的结果{{1}并且它不存在,我怎样才能获得文件的确切位置?
谢谢
详情:
以下是一些代码和解决方案(不好但工作正常):
PATH_TO_MY_WORKSPACE/projectName/filename
我正在循环使用factDir为 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));
}
}
}
}
}
的目录,我正在寻找只有TEMP_COMPARE_FILE值的BeProcessed.txt文件,并且我将它们发送到读取文件并处理它的进程方法。
如果有人能够更好地解决问题我会很高兴
答案 0 :(得分: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);
}
}
请注意,此代码模仿原始代码的行为,就像我理解的那样;最值得注意的是,它只在factDir
的直接子目录中找到具有正确名称的文件,非递归。
答案 1 :(得分:2)
我认为,当且仅当文件位于程序目录中时,它才有助于您。
首先通过以下方式获取程序目录:
new File(".").getCanonicalPath()
然后:
如果file
位于folder\\filename
等特定目录中
完整路径将是
(new File(".").getCanonicalPath() + "\\folder\\filename")
或者如果file
直接位于程序目录中:
完整路径将是
(new File(".").getCanonicalPath() + "\\filename")
我希望这个答案可以帮助你:)