网站首页 > 技术教程 正文
文件描述符
当应用程序请求打开或者操作文件时,操作系统为应用程序设置一张文件列表,具体的实现形式此处不深入说明
操作系统会提供给你一个非负整数,作为一个索引号,它的作用就像地址或者说指针或者说偏移量
这个索引号就用来定位文件数据在内存中的位置.
这个概念在类Unix系统叫做文件描述符, linux把所有东西都被看成是文件,比如文件、目录、进程、网络socket、各种硬件设备等
这个概念在Windows下 称之为句柄, 句柄是Windows下各种对象的标识符, 比如文件、资源、菜单、光标、位图等
如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。
那么,现在你应该可以理解文件描述符的含义了
文件描述符 之于文件系统(操作系统中的一切都是文件描述符 可以使用文件描述符描述任何一个资源对象
就如同Class 之于java语言一样(java中一切都是类,都是一个Class的实例,任何一个类都用Class对象的实例来描述
Java中使用FileDescriptor 来抽象文件描述符这一概念
package java.io;
对于FileInputStream/FileOutputStream/RandomAccessFile,使用handle来表示底层的文件句柄
对于ServerSocket/Socket,使用fd来表示底层的文件句柄
FileDescriptor的fd和handle的无效值是-1
看下API的描述:
文件描述符类的实例用作与基础机器有关的某种结构的不透明句柄
该结构表示开放文件、开放套接字或者字节的另一个源或接收者。
文件描述符的主要实际用途是创建一个包含该结构的 FileInputStream 或 FileOutputStream。
应用程序不应创建自己的文件描述符。
其实说白了,就是文件描述符的实例,就是用来表示文件的一个指针/索引. 操作系统通过这个值与应用程序交互
如同你的电话号码一样,在很多场景,他就相当于你, 虽然,他完全不是你,
比如朋友想找你聊天,有人托你办事,保险公司推销等等,通过电话都可以定位到你
而且,你自己能造一个电话号码么?显然不行,必须是运营商提供给你的
我们的文件描述符,也是如此,应用程序不应该创建自己的文件描述符
他的构造方法,只能创建一个无效的文件描述符
不应该创建自己的文件描述符,可以直接理解为:
这东西是底层实现的内容,操作系统来传递给你
而且,对于文件的其他的一些操作,最底层的实现也仍旧是操作系统来搞
这就相当于操作系统给你的一个指针,钥匙
你需要服务的时候,拿给操作系统即可,具体到底怎么玩,你管不上,也管不了
想要理解文件描述符只需要理解,文件的抽象概念是操作系统负责管理维护的
应用程序都是在请求操作系统帮忙,JVM也就是个应用程序
不管那个位置到底存放的是什么,对于应用程序来说就是一个描述符
操作系统提供了一致性的接口访问途径,就是通过这个描述符
描述符背后到底是什么,操作系统屏蔽了这些东西
这样子的实现,对应用程序程序员来说,就是不需要在关注他到底是个什东西,操作系统来搞定
FileDescriptor中的三个描述符
FileDescriptor 内置了三个文件描述符 分别是 in out err
类型是FileDescriptor 这是java层面的描述
具体的值是 0 1 2 ,这是操作系统层面的描述
在linux 中, 每个进程启动时都打开3个文件(linux 中一切都是文件):
* 标准输入 0
* 标准输出 1
* 标准错误 2
如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。
三个描述符,通过调用私有方法 standardStream进行创建初始化
创建一个FileDescriptor 并且,设置他的handle值
内部的set(fd)是一个本地方法
说白了,就是通过调用本地方法,获得操作系统对标准输入/输出/错误的三个文件描述符
注释中也说的很清楚,文件描述符一般不直接使用
通过使用System.in System.out System.err
文件描述符在System类中的应用
在System 中 in out err 都是 final static的
标准的输入输出是共享,但是java是多线程的
因此它们必须受到特别的处理,在系统初始化完成之前,线程严禁使用这几个特殊对象;
又因为这些对象都是静态的,因此java的类加载机制会在System类加载的时候就会初始化,这就造成了一对矛盾;
为解决这对矛盾,System在加载是将它们初始化为null,等加在完成后,通过 initializeSystemClass
System中in out err中的定义部分,全都是final static
注释中也很明确的说明了 将会调用 initializeSystemClass 进行部分初始化工作
initializeSystemClass 方法的关键部位 以及 本地的setIn0 setOut0 setErr0initializeSystemClass 方法对于这块来说,主要就是
使用三个文件描述符 创建了 FileInputStream 以及 FileOutputStream
对于Out以及Err又根据encoding 转换为PrintStream
然后通过本地方法进行设置
所以说,那三个专门的文件描述符一般不直接使用
取而代之的则是使用文件描述符 初始化设置过的流对象
如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。
应用程序不创建文件描述符, 都是由系统调用, 也就是本地方法来操作的
应用程序只是获得, 然后使用, 所谓使用,最终也还是需要借助于操作系统
是应用程序 操作文件 时 与操作系统进行交互时,必须的数据项
猜你喜欢
- 2024-10-25 Auto CAD 常用系统变量 cad2020系统变量
- 2024-10-25 做开发十年,我总结出了这些开发经验
- 2024-10-25 Windows高级工程师:GDI/GDI+绘图;基础入门大全
- 2024-10-25 菜比手把手教你破解游戏多开(轻喷)
- 2024-10-25 JVM 完整深入解析 jvm解析阶段
- 2024-10-25 Linux打开的文件过多Too many open file
- 2024-10-25 一文看完Oracle数据库之PGA概念、组成、自动管理、参数及视图
- 2024-10-25 JavaScript 中内存泄漏的原因以及对策
- 2024-10-25 史上最全Oracle文件损坏处理办法(附实验步骤)
- 2024-10-25 C++消息循环GetMessage/TranslateMessage/DispatchMessage
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- sd分区 (65)
- raid5数据恢复 (81)
- 地址转换 (73)
- 手机存储卡根目录 (55)
- tcp端口 (74)
- project server (59)
- 双击ctrl (55)
- 鼠标 单击变双击 (67)
- debugview (59)
- 字符动画 (65)
- flushdns (57)
- ps复制快捷键 (57)
- 清除系统垃圾代码 (58)
- web服务器的架设 (67)
- 16进制转换 (69)
- xclient (55)
- ps源文件 (67)
- filezilla server (59)
- 句柄无效 (56)
- word页眉页脚设置 (59)
- ansys实例 (56)
- 6 1 3固件 (59)
- sqlserver2000挂起 (59)
- vm虚拟主机 (55)
- config (61)
本文暂时没有评论,来添加一个吧(●'◡'●)