Java 文件操作的一些要点:Java File 与 Windows 拒绝权限、ByteArrayInputStream 关闭建议、流操作的文件锁定

一、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();
}
# 输出结果

现在尝试删除文件
文件删除成功
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值