文件描述符

 
当应用程序请求打开或者操作文件时,操作系统为应用程序设置一张文件列表,具体的实现形式此处不深入说明
操作系统会提供给你一个非负整数,作为一个索引号,它的作用就像地址或者说指针或者说偏移量
这个索引号就用来定位文件数据在内存中的位置.
这个概念在类Unix系统叫做文件描述符, linux把所有东西都被看成是文件,比如文件、目录、进程、网络socket、各种硬件设备等
这个概念在Windows下 称之为句柄, 句柄是Windows下各种对象的标识符, 比如文件、资源、菜单、光标、位图等
那么,现在你应该可以理解文件描述符的含义了
文件描述符  之于文件系统(操作系统中的一切都是文件描述符 可以使用文件描述符描述任何一个资源对象
就如同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

 
三个描述符,通过调用私有方法 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 setErr0
initializeSystemClass 方法对于这块来说,主要就是
使用三个文件描述符  创建了 FileInputStream  以及 FileOutputStream
对于Out以及Err又根据encoding 转换为PrintStream
然后通过本地方法进行设置
所以说,那三个专门的文件描述符一般不直接使用
取而代之的则是使用文件描述符 初始化设置过的流对象
 
 
 
应用程序不创建文件描述符, 都是由系统调用, 也就是本地方法来操作的
应用程序只是获得,  然后使用,  所谓使用,最终也还是需要借助于操作系统
是应用程序 操作文件 时 与操作系统进行交互时,必须的数据项 
 
 
 

[一]FileDescriptor文件描述符 标准输入输出错误 文件描述符的更多相关文章

  1. Python基础笔记系列十一:标准输入输出、文件读写和指针等操作

    本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 标准输入输出一.输入 在sublime中这个时候需要安装SublimeRE ...

  2. linux标准输入输出错误输出

    Linux Shell 环境中支持输入输出重定向,用符号"<"和">"来表示.0.1和2分别表示标准输入.标准输出和标准错误信息输出,可以用来指定需 ...

  3. flockfile, ftrylockfile, funlockfile - 为标准输入输出锁定文件 FILE

    SYNOPSIS 总览 #include <stdio.h> void flockfile(FILE *filehandle); int ftrylockfile(FILE *fileha ...

  4. NPOI-Excel系列-1000.创建一个标准的Excel文件

    using NPOI.HSSF.UserModel; using Microsoft.VisualStudio.TestTools.UnitTesting; using System.IO; name ...

  5. ARM 之一 ELF文件、镜像(Image)文件、可执行文件、对象文件 详解

    [转]https://blog.csdn.net/ZCShouCSDN/article/details/100048461 ELF 文件规范   ELF(Executable and Linking ...

  6. Linux 标准输入输出、错误输出、重定向标准输出

    再来看看 >& 操作符: 重定向操作符 描述 > 将命令输出写入到文件或设备(如打印机),而不是命令提示符窗口或句柄. < 从文件而不是从键盘或句柄读入命令输入. >& ...

  7. [svc]linux中的文件描述符(file descriptor)和文件

    linux中的文件描述符(file descriptor)和文件 linux为了实现一切皆文件的设计哲学,不仅将数据抽象成了文件,也将一切操作和资源抽象成了文件,比如说硬件设备,socket,磁盘,进 ...

  8. linux标准输入输出及错误输出

    Linux Shell 环境中支持输入输出重定向,用符号"<"和">"来表示. 0.1和2分别表示标准输入.标准输出和标准错误信息输出,可以用来指定 ...

  9. [C++STDlib基础]关于C标准输入输出的操作——C++标准库头文件<cstdio>

    网上实例 总结 /* _STD_BEGIN using _CSTD clearerr; using _CSTD fclose; using _CSTD feof; using _CSTD ferror ...

随机推荐

  1. Day2----《Pattern Recognition and Machine Learning》Christopher M. Bishop

    用一个例子来讲述regression. 采用sin(2*pi*x)加入微弱的正态分布噪声的方式来获得一些数据,然后用多项式模型来进行拟合. 在评价模型的准确性时,采用了误差函数的方式,用根均方误差的方 ...

  2. Linux下Shell重定向

    1. 标准输入,标准输出与标准错误输出 Linux下系统打开3个文件,标准输入,标准输出,标准错误输出. 标准输入:从键盘输入数据,即从键盘读入数据. 标准输出:把数据输出到终端上. 标准错误输出:把 ...

  3. WinForm的.Designer.cs代码内抛反射异常

    今天在项目内一个Winform增加控件后,无法打开,抛如下异常. System.Reflection.TargetInvocationException: Exception has been thr ...

  4. Jquery weui picker 支持label和value

    万年没更新了. 最近用jquery weui. 在使用picker时需要一些问题. 就是让picker 显示label, 但是取值的时候取value用于存储. 官网例子如下 Jquery-weui 官 ...

  5. su;su -;sudo;sudo -i;sudo su;sudo su - 之间的区别

    今天我们来聊聊su;su -;sudo;sudo -i;sudo su;sudo su -他们之间的区别. su :su 在不加任何参数,默认为切换到root用户,但没有转到root用户家目录下,也就 ...

  6. [译文]Domain Driven Design Reference(七)—— 大型战略设计结构

    本书是Eric Evans对他自己写的<领域驱动设计-软件核心复杂性应对之道>的一本字典式的参考书,可用于快速查找<领域驱动设计>中的诸多概念及其简明解释. 上周末电脑硬盘文件 ...

  7. 一个自己研究出来的字符串匹配算法-k子串算法

    前言 最近工作中需要写一个算法,而写完这个算法我却发现了一个很有意思的事情.需要的这个算法是这样的:对于A,B两个字符串,找出最多K个公共子串,使得这K个子串长度和最大.百度之没有这样的算法,然后就开 ...

  8. IdentityServer(14)- 通过EntityFramework Core持久化配置和操作数据

    本文用了EF,如果不适用EF的,请参考这篇文章,实现这些接口来自己定义存储等逻辑.http://www.cnblogs.com/stulzq/p/8144056.html IdentityServer ...

  9. js 格式化数字,格式化金额:

    js 格式化数字,格式化金额: function number_format(number, decimals, dec_point, thousands_sep) { /* * 参数说明: * nu ...

  10. [Java]LeetCode141. 环形链表 | Linked List Cycle

    Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using ext ...