我有以下代码需要捕获AccessDeniedException
异常
import java.io.PrintWriter;
import java.io.IOException;
import java.nio.file.AccessDeniedException;
class MyFileClass {
public void write()
throws IOException
{
PrintWriter out = new PrintWriter("sample.txt");
out.printf("%8.2f\n", 3.4);
out.close();
}
}
public class MyClass {
public static void main(String[] args)
throws Exception
{
try {
MyFileClass mf = new MyFileClass();
mf.write();
} catch (AccessDeniedException e) {
print("Access denided");
}
catch (FileNotFoundException e) {
print("File not found");
}
}
}
如果 sample.txt 是只读的,我会输出" 找不到文件"而#34; 访问权限"。我想了解这是什么原因?此外,上述用于捕捉AccessDeniedException
的结构是否正确?
答案 0 :(得分:7)
AccessDeniedException
仅由新文件API抛出;旧文件API(您使用此PrintWriter
构造函数)只知道如何抛出FileNotFoundException
,即使真正的文件系统级问题不是"该文件不存在"。
您必须使用新API打开目标文件的输出流; 然后你可以有有意义的例外:
// _will_ throw AccessDeniedException on access problems
final OutputStream out = Files.newOutputStream(Paths.get(filename));
final PrintWriter writer = new PrintWriter(out);
更一般地说,新文件API定义FileSystemException
(继承IOException
),新API定义的所有新的有意义的异常都会继承。
这意味着您可以在catch子句中明确区分由文件系统级错误和"真实"引起的错误。 I / O错误,您可以使用旧API:
try {
// some new file API operation
} catch (FileSystemException e) {
// deal with fs error
} catch (IOException e) {
// deal with I/O error
}
答案 1 :(得分:1)
AccessDeniedException
中有否这样的PrintWriter
。
SecurityException
是PrintWriter
如果存在安全管理器且checkWrite(file.getPath())拒绝 写访问文件