为什么在 java 中使用 java.security.SecurityManager 可以读取任何文件?

Why any file can be read with using java.security.SecurityManager in java?

我只想在我的 Java 程序中读取和写入一些文件。所以我用java.security.SecurityManager来管理这个,但似乎不尽如人意。

Main.java 文件在下面

import java.io.*;
import java.util.*;
public class Main {
    static private final String INPUT = "in.txt";
    public static void main(String args[]) throws Exception {
        FileInputStream instream = null;
        BufferedReader reader = new BufferedReader(new FileReader(INPUT));
        String tempString = null;
        while ((tempString = reader.readLine()) != null) {
            System.out.println(tempString);
        }
    }
}

和文件 /opt/java.policy 如下所示

grant {
    permission java.io.FilePermission "./out.txt", "write";
};

那我运行

java -Xss64m -Xms16m -Xmx512m -Djava.security.manager -Djava.security.policy=/opt/java.policy Main

但是没有错误,输出就是in.txt的样子。我尝试了其他文件并得到了相同的结果。为什么会这样?

来自Javadoc

Please note: Code can always read a file from the same directory it's in (or a subdirectory of that directory); it does not need explicit permission to do so.

并不是说这是明确的。代码不是 'in' 目录:它是 当前工作目录执行的,这似乎就是这个意思。