一、Java File 与 Windows 拒绝权限

  1. 在 Windows 的文件的 【属性 - 安全】 面板中拒绝了读取权限,但 canRead 方法仍然返回 true,(存疑)canRead 方法只检查允许的权限,不检查拒绝的权限
File file = new File("file/filepermissiontest/testImageNoRead.png");

if (file.canRead()) {
    System.out.println("文件可读取");
} else {
    System.out.println("文件不可读取");
}
# 输出结果

文件可读取
  1. 在这种情况下,可以创建 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)有本质区别
  1. ByteArrayInputStream 和 ByteArrayOutputStream 它们的数据源不是一个需要释放的外部资源(例如,文件句柄、网络连接),而仅是内存中的一个字节数组

  2. 文件流如果不关闭,可能会造成文件被锁定,无法被其他进程操作,或者耗尽系统允许的最大文件句柄数,而 ByteArrayInputStream 和 ByteArrayOutputStream 不涉及这类系统资源

  3. 而且,ByteArrayInputStream 和 ByteArrayOutputStream 的 close 方法只是空实现,不执行任何操作

public void close() throws IOException {
}

三、流操作的文件锁定

  1. 没有关闭 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();
}
# 输出结果

现在尝试删除文件
文件删除失败,文件被占用
  1. 关闭 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();
}
# 输出结果

现在尝试删除文件
文件删除成功
  1. 没有关闭 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();
}
# 输出结果

现在尝试删除文件
文件删除失败,文件被占用
  1. 关闭 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();
}
# 输出结果

现在尝试删除文件
文件删除成功
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐