gpt4 book ai didi

Java无法获取当前目录中存在的文件的路径

转载 作者:行者123 更新时间:2023-12-02 09:39:14 27 4
gpt4 key购买 nike

如果文件存在于运行 Java 应用程序的同一目录中,并且我为该文件创建了一个 File 对象,则文件路径的 Java File 方法也包含文件名。代码和输出如下。

如果这是我正在使用的 JDK 版本中的一个错误,那么现在肯定有人会看到它。

为什么 File.getAbsolutePath() 和 File.getCanonicalPath() 包含文件名? Javadoc 指示应返回目录名称。

import java.io.File;
import java.io.IOException;


public class DirectoryFromFile {

private void getDirectoryOfFile(String fileName) throws IOException{

File f = new File(fileName );

System.out.println("exists(): " + f.exists());
System.out.println("getPath(): " + f.getPath());
System.out.println("getAbsolutePath(): " + f.getAbsolutePath());
System.out.println("getParent(): " + f.getParent() );
System.out.println("getCanonicalPath(): " + f.getCanonicalPath() );
System.out.println("getAbsoluteFile().getCanonicalPath(): " + f.getAbsoluteFile().getCanonicalPath() );
String dirname = f.getCanonicalPath();
System.out.println("dirname: " + dirname);
File dir = new File(dirname);
System.out.println("dir: " + dir.getAbsolutePath());

if (dirname.endsWith(fileName))
dirname = dirname.substring(0, dirname.length() - fileName.length());
System.out.println("dirname: " + dirname);
File dir2 = new File(dirname);
System.out.println("dir2: " + dir2.getAbsolutePath());
}

public static void main(String[] args) {

DirectoryFromFile dff = new DirectoryFromFile();
try {
dff.getDirectoryOfFile("test.txt");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

这里是输出:

exists(): true
getPath(): test.txt
getAbsolutePath(): C:\dean\src\java\directorytest\directory.from.file\test.txt
getParent(): null
getCanonicalPath(): C:\dean\src\java\directorytest\directory.from.file\test.txt
getAbsoluteFile().getCanonicalPath(): C:\dean\src\java\directorytest\directory.from.file\test.txt
dirname: C:\dean\src\java\directorytest\directory.from.file\test.txt
dir: C:\dean\src\java\directorytest\directory.from.file\test.txt
dirname: C:\dean\src\java\directorytest\directory.from.file\
dir2: C:\dean\src\java\directorytest\directory.from.file
<小时/>

到目前为止,我发现在这种情况下获取目录的唯一方法是手动解析文件名。

在这种情况下,File 类是否有办法获取目录名称(在不指定目录的情况下创建当前目录中存在的文件)?

最佳答案

Why do File.getAbsolutePath() and File.getCanonicalPath() include the file name? The Javadocs indicate that the directory name should be returned.

不,他们没有。如果您愿意指出您认为他们这样做的原因,那么有人可能会指出您推理中的错误。此外,如果您在给定某些特定输入的情况下准确指定您希望看到的输出内容,我们也可以为您提供帮助。您的问题标题似乎也很奇怪,因为您的问题似乎是它返回文件的完整路径。

编辑:我想我理解您困惑的根源。一个File以与平台无关的方式表示文件系统路径。它可以是文件或目录的路径。它也始终代表相同的路径,尽管不一定是相同的绝对路径。这是一个非常细微但非常重要的区别。表示相对路径的 File 对象始终是相对的。给定一个代表相对路径的 File,可以使用 getAbsolutePath() 获取当前对应的绝对路径。然而,这并没有改变文件代表相对路径的事实。对同一 File 对象进一步调用 getAbsolutePath() 可能会返回不同的值。例如,请考虑:

// A relative file
File foo = new File("foo.txt");
// Resolve relative file against CWD
System.out.println(foo.getAbsolutePath());
// Output: D:\dev\projects\testbed\foo.txt
System.setProperty("user.dir", "C:\\somewhere");
// Resolve relative file against new CWD
System.out.println(foo.getAbsolutePath());
// Output: C:\somewhere\foo.txt
// Get an absolute file
File absoluteFoo = foo.getAbsoluteFile();
// Show absolute path
System.out.println(absoluteFoo.getAbsolutePath());
// Output: C:\somewhere\foo.txt
System.setProperty("user.dir", "D:\\somewhere-else");
// An absolute path doesn't change when the CWD changes
System.out.println(absoluteFoo.getAbsolutePath());
// Output: C:\somewhere\foo.txt

现在应该清楚了,文件所代表的路径只是:路径。此外,路径可以由零个或多个部分组成,并且在任何文件上调用 getParent() 都会返回该文件的路径,并删除最后一个路径元素,除非没有要删除的“最后一个路径元素”。因此,new File("foo").getParent() 的预期结果是 null,因为相对路径“foo”没有父路径。

从上面的示例和解释中,您应该能够看到,当您创建相对路径 File 对象时,获取包含目录的方法是:

String absoluteParentDirPath = someRelativeFile.getAbsoluteFile().getParent();

需要注意的是,“绝对路径”取决于您当时的环境。

附加说明:由于文件是可序列化的,因此您可以将相对路径文件写入磁盘或通过网络发送它。该文件在另一个 JVM 中反序列化时,仍将表示相对路径,并将根据该 JVM 的当前工作目录进行解析。

关于Java无法获取当前目录中存在的文件的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7153729/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com