2

我将 java 属性 user.dir 设置为/home/alex/projects/poltava/rpgu/workingdir。我也有文件q.txt在上面的文件夹中

以下是代码片段及其返回值(在 = 之后):

System.getProperty("user.dir") = /home/alex/projects/poltava/rpgu/workingdir
new File(".").getAbsolutePath() = /home/alex/projects/poltava/rpgu/workingdir/.
new File(".").exists() = true
new File("q.txt").getAbsolutePath() = /home/alex/projects/poltava/rpgu/workingdir/q.txt
new File("q.txt").exists() = false
new File(new File("q.txt").getAbsolutePath()).exists() = true
new FileInputStream("q.txt") = threw FileNotFoundException

这样您就可以看到文件确实存在于文件系统中。当我尝试使用绝对路径获取它时,一切都很好。当我尝试使用相对路径获取它时,它失败了。

我对相对路径有什么问题?

编辑:

演示问题的小应用程序:

import java.io.File;

public class Test {
    public static void main(String[] args) {
        System.setProperty("user.dir", "/home/alex/projects/poltava/rpgu/workingdir");
        System.out.println(System.getProperty("user.dir"));
        System.out.println(new File("q.txt").exists());
        System.out.println(new File("q.txt").isFile());
        System.out.println(new File("q.txt").canRead());

        System.out.println(new File("q.txt").getAbsolutePath());
        System.out.println(new File(new File("q.txt").getAbsolutePath()).exists());
        System.out.println(new File(new File("q.txt").getAbsolutePath()).isFile());
        System.out.println(new File(new File("q.txt").getAbsolutePath()).canRead());

        try {
            new FileInputStream("q.txt");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

输出:

/home/alex/projects/poltava/rpgu/workingdir
false
false
false
/home/alex/projects/poltava/rpgu/workingdir/q.txt
true
true
true
java.io.FileNotFoundException: q.txt (No such file or directory)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:146)
    at java.io.FileInputStream.<init>(FileInputStream.java:101)
    at Test.main(Test.java:24)

编辑2:

我还尝试了另一个简单的例子:

File f = new File("q1.txt");
System.out.println(f.createNewFile());
System.out.println(f.getPath());
System.out.println(f.getAbsolutePath());

输出:

true
q1.txt
/home/alex/projects/poltava/rpgu/workingdir/q1.txt

结果文件是在我启动应用程序的目录中创建的。不在user.dir目录中。并getAbsolutePath()返回不正确的文件路径。

4

2 回答 2

1

我认为阅读File 的 javadoc会更好。

一些帮助您入门的解释:

对于您正在使用的构造函数:

公共文件(字符串路径名)

通过将给定的路径名​​字符串转换为抽象路径名来创建一个新的 File 实例。如果给定的字符串是空字符串,则结果是空的抽象路径名。

所以基本上你得到的是一个 File 实例,带有抽象路径名“ q.txt”。

当您对此进行操作时会发生什么getAbsolutePath()。再次来自javadoc:

public String getAbsolutePath()

返回此抽象路径名的绝对路径名字符串。如果此抽象路径名已经是绝对路径名,则路径名字符串就像getPath()方法一样简单地返回。user.dir如果此抽象路径名是空的抽象路径名,则返回由系统属性命名的当前用户目录的路径名字符串。否则,此路径名将以系统相关的方式解析。在 UNIX 系统上,通过根据当前用户目录解析相对路径名,使其成为绝对路径名。

在 Microsoft Windows 系统上,通过将相对路径名解析为由路径名命名的驱动器的当前目录(如果有),从而使相对路径名成为绝对路径;如果不是,则针对当前用户目录进行解析。

你看到发生了什么吗?特别是,关于user.dir?

更多提示:

现在创建另一个变量,例如

File newFile = new File(System.getProperty("user.dir"), "q.txt").

在 上尝试相同的操作newFile。尝试getParent()在您的前一个和这个上使用。你会看到区别。

我希望这有助于为您澄清几点:)

于 2013-09-20T07:24:21.813 回答
0

这是因为 File(String str) 会调用 normalize,但 getAbsolutePath 也会调用 resolve,这是使用 user.dir 的地方。看下面的例子。

System.setProperty("user.dir", "/home/alex/projects/poltava/rpgu/workingdir");

File fString = new File("Test.txt");
File fAbsolutePath = new File(fString.getAbsolutePath());

System.out.println(System.getProperty("user.dir"));
System.out.println(fString.getPath());
System.out.println(fAbsolutePath.getPath());

这是输出:

/home/alex/projects/poltava/rpgu/workingdir
Test.txt
\home\alex\projects\poltava\rpgu\workingdir\Test.txt

您可以在此处查看 src 代码:new File(String str) http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/io/File.java#文件.%3Cinit%3E%28java.io.File%2Cjava.lang.String%29

getAbsolutePath: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/io/File.java#File.getAbsolutePath%28%29

于 2013-09-20T07:23:39.527 回答