一、Java File 与 Windows 拒绝权限
- 在 Windows 的文件的 【属性 - 安全】 面板中拒绝了读取权限,但 canRead 方法仍然返回 true,(存疑)canRead 方法只检查允许的权限,不检查拒绝的权限
File file = new File("file/filepermissiontest/testImageNoRead.png");
if (file.canRead()) {
System.out.println("文件可读取");
} else {
System.out.println("文件不可读取");
}
# 输出结果
文件可读取
- 在这种情况下,可以创建 FileInputStream 来判断文件是否可读取
File file = new File("file/filepermissiontest/testImageNoRead.png");
try {
FileInputStream fileInputStream = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
# 输出结果
java.io.FileNotFoundException: file\filepermissiontest\testImageNoRead.png (拒绝访问。)
二、ByteArrayInputStream 与 ByteArrayOutputStream 关闭建议
- ByteArrayInputStream 与 ByteArrayOutputStream 不需要关闭,它们与其他流(例如,FileInputStream)有本质区别
-
ByteArrayInputStream 和 ByteArrayOutputStream 它们的数据源不是一个需要释放的外部资源(例如,文件句柄、网络连接),而仅是内存中的一个字节数组
-
文件流如果不关闭,可能会造成文件被锁定,无法被其他进程操作,或者耗尽系统允许的最大文件句柄数,而 ByteArrayInputStream 和 ByteArrayOutputStream 不涉及这类系统资源
-
而且,ByteArrayInputStream 和 ByteArrayOutputStream 的 close 方法只是空实现,不执行任何操作
public void close() throws IOException {
}
三、流操作的文件锁定
- 没有关闭 FileOutputStream 会导致文件被占用,无法删除
try {
FileOutputStream fileOutputStream = new FileOutputStream("file/filepermissiontest/testfile.txt");
fileOutputStream.write("Hello World".getBytes());
System.out.println("现在尝试删除文件");
File file = new File("file/filepermissiontest/testfile.txt");
if (file.delete()) {
System.out.println("文件删除成功");
} else {
System.out.println("文件删除失败,文件被占用");
}
} catch (IOException e) {
e.printStackTrace();
}
# 输出结果
现在尝试删除文件
文件删除失败,文件被占用
- 关闭 FileOutputStream 后,文件才能被删除
try {
FileOutputStream fileOutputStream = new FileOutputStream("file/filepermissiontest/testfile.txt");
fileOutputStream.write("Hello World".getBytes());
fileOutputStream.close();
System.out.println("现在尝试删除文件");
File file = new File("file/filepermissiontest/testfile.txt");
if (file.delete()) {
System.out.println("文件删除成功");
} else {
System.out.println("文件删除失败,文件被占用");
}
} catch (IOException e) {
e.printStackTrace();
}
# 输出结果
现在尝试删除文件
文件删除成功
- 没有关闭 FileInputStream 会导致文件被占用,无法删除
try {
FileOutputStream fileOutputStream = new FileOutputStream("file/filepermissiontest/testfile.txt");
fileOutputStream.write("Hello World".getBytes());
fileOutputStream.close();
FileInputStream fileInputStream = new FileInputStream("file/filepermissiontest/testfile.txt");
System.out.println("现在尝试删除文件");
File file = new File("file/filepermissiontest/testfile.txt");
if (file.delete()) {
System.out.println("文件删除成功");
} else {
System.out.println("文件删除失败,文件被占用");
}
} catch (IOException e) {
e.printStackTrace();
}
# 输出结果
现在尝试删除文件
文件删除失败,文件被占用
- 关闭 FileInputStream 后,文件才能被删除
try {
FileOutputStream fileOutputStream = new FileOutputStream("file/filepermissiontest/testfile.txt");
fileOutputStream.write("Hello World".getBytes());
fileOutputStream.close();
FileInputStream fileInputStream = new FileInputStream("file/filepermissiontest/testfile.txt");
fileInputStream.close();
System.out.println("现在尝试删除文件");
File file = new File("file/filepermissiontest/testfile.txt");
if (file.delete()) {
System.out.println("文件删除成功");
} else {
System.out.println("文件删除失败,文件被占用");
}
} catch (IOException e) {
e.printStackTrace();
}
# 输出结果
现在尝试删除文件
文件删除成功
104万+

被折叠的 条评论
为什么被折叠?



