如果文件存在于运行Java应用程序的同一目录中,并且我为该文件创建了File对象,则文件路径的Java File方法也包含文件名.代码和输出如下.
如果这是JDK版本中的一个错误我正在使用某人肯定会看到它.
为什么File.getAbsolutePath()和File.getCanonicalPath()包含文件名?Javadocs表示应该返回目录名.
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这里是输出:
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
Run Code Online (Sandbox Code Playgroud)
到目前为止,我发现在这种情况下获取目录的唯一方法是手动解析文件名.
在这种情况下,File类是否有办法获取目录名称(创建当前目录中存在的文件而不指定目录)?
Rya*_*art 10
为什么File.getAbsolutePath()和File.getCanonicalPath()包含文件名?Javadocs表示应该返回目录名.
不,他们没有.如果你想指出你认为他们为什么这样做,有人可能会在你的推理中发现错误.此外,如果您在给定特定输入的情况下准确指定了您希望看到的输出,我们也可以帮助您.你的问题的标题似乎很奇怪,也因为你的问题似乎是,它是返回的完整路径的文件.
编辑:我想我理解你混乱的根源.一个文件代表在平台无关的方式的文件系统路径.它可以是文件或目录的路径.它也总是表示相同的路径,但不一定是相同的绝对路径.这是一个非常精细的区别,但非常重要.表示相对路径的File对象始终是相对的.给定表示相对路径的File,您可以使用getAbsolutePath()获取当前对应的绝对路径.但是,这并没有改变File表示相对路径的事实.在同一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
Run Code Online (Sandbox Code Playgroud)
现在应该清楚,File表示的路径只是:路径.此外,路径可以由零个或多个部分组成,并且在任何File上调用getParent()会返回该文件的路径,并删除最后一个路径元素,除非没有要删除的"最后路径元素".因此预期的结果new File("foo").getParent()
是null
因为相对路径"foo"没有父级.
从上面的示例和解释,您应该能够看到在创建相对路径File对象时获取包含目录的方法是
String absoluteParentDirPath = someRelativeFile.getAbsoluteFile().getParent();
Run Code Online (Sandbox Code Playgroud)
需要注意的是,"绝对路径"取决于当时的环境.
附加说明:由于File是Serializable,您可以将相对路径文件写入磁盘或通过网络发送.该文件在另一个JVM中反序列化时仍将表示相对路径,并将根据该JVM的当前工作目录进行解析.
归档时间: |
|
查看次数: |
12048 次 |
最近记录: |