文件描述符 之于文件系统(操做系统中的一切都是文件描述符 可使用文件描述符描述任何一个资源对象
就如同Class 之于java语言同样(java中一切都是类,都是一个Class的实例,任何一个类都用Class对象的实例来描述
|
文件描述符类的实例用做与基础机器有关的某种结构的不透明句柄
该结构表示开放文件、开放套接字或者字节的另外一个源或接收者。
文件描述符的主要实际用途是建立一个包含该结构的 FileInputStream 或 FileOutputStream。
应用程序不该建立本身的文件描述符。
|
三个描述符,经过调用私有方法 standardStream进行建立初始化
建立一个FileDescriptor 而且,设置他的handle值
内部的set(fd)是一个本地方法
说白了,就是经过调用本地方法,得到操做系统对标准输入/输出/错误的三个文件描述符
|
注释中也说的很清楚,文件描述符通常不直接使用 经过使用System.in System.out System.err |
在System 中 in out err 都是 final static的
|
标准的输入输出是共享,可是java是多线程的
所以它们必须受到特别的处理,在系统初始化完成以前,线程严禁使用这几个特殊对象;
又由于这些对象都是静态的,所以java的类加载机制会在System类加载的时候就会初始化,这就形成了一对矛盾;
为解决这对矛盾,System在加载是将它们初始化为null,等加在完成后,经过 initializeSystemClass
|
initializeSystemClass 方法的关键部位 以及 本地的setIn0 setOut0 setErr0
|
initializeSystemClass 方法对于这块来讲,主要就是
使用三个文件描述符 建立了 FileInputStream 以及 FileOutputStream
对于Out以及Err又根据encoding 转换为PrintStream
而后经过本地方法进行设置
|
因此说,那三个专门的文件描述符通常不直接使用 取而代之的则是使用文件描述符 初始化设置过的流对象 |
应用程序不建立文件描述符, 都是由系统调用, 也就是本地方法来操做的
应用程序只是得到, 而后使用, 所谓使用,最终也仍是须要借助于操做系统
是应用程序 操做文件 时 与操做系统进行交互时,必须的数据项
|