FileDescriptor解读

FileInputStream、FileOutputStream、SocketInputStream、SocketOutputStream中都有一个FileDescriptor对象,我们可以将这个文件描述符对象类比为我们要操作的文件在JVM中的一个句柄,但是这个句柄并没有实际对文件进行操作的动作,要想读取或者写入文件只能创建对象的输入流和输出流对象,FileDescriptor在输入输出流对象当中
摘要由CSDN通过智能技术生成

FileInputStream、FileOutputStream、SocketInputStream、SocketOutputStream中都有一个FileDescriptor对象,我们可以将这个文件描述符对象类比为我们要操作的文件在JVM中的一个句柄,但是这个句柄并没有实际对文件进行操作的动作,要想读取或者写入文件只能创建对象的输入流和输出流对象,FileDescriptor在输入输出流对象当中,他们是结合在一起的,如果只有一个FileDescriptor实例,而两个InputStream想从这个文件描述符对应的同一个文件中读取数据,那么就需要持有同一个FileDescriptor对象,输入也是一样,FileInputStream、FileOutputStream都对应的提供了通过FileDescriptor对象实例化的构造方法。


FileDescriptor类有一个useCount的属性,定义如下:


 private AtomicInteger useCount;


这个字段就是记录当前有多少了输入输出流对象关联了这个FileDescriptor对象,当我们调用FileInputStream、FileOutputStream的close方法是close方法时,首先将useCount减1,然后做了一个判断,代码如下:

if ((useCount <= 0) || !isRunningFinalize()) {

            close0();


}

如果当前useCount对象的值已经小于等于0的时候才会真正执行native的系统调用,关闭这个文件。



FileInputStream、FileOutputStream最底层的native的方法中,并没有看到对FileDescriptor的引用,而在上文SocketInputStream、SocketOutputStream对象对应的native调用方法中都提供了FileDescriptor对象的引用,





实际上这个在JDK以前的版本中是存在为FileDescriptor的一个long类型的名称为handle的字段,注意再FileInputStream、FileOutputStream中都有一下这么一段代码,而FileDescriptor也存在一个initIDs方法,都是在已静态代码块的形式存在的,他们的作用是相同的,就是设置属性的内存地址偏移量,FileInputStream的initIDs方法只设置了fd这一个属性的内存地址偏移量,FileDescriptor设置了两个属性(fd和handle)的内存地址偏移量。

private static native void initIDs();


    static {

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值