文件描述符

 
当应用程序请求打开或者操作文件时,操作系统为应用程序设置一张文件列表,具体的实现形式此处不深入说明
操作系统会提供给你一个非负整数,作为一个索引号,它的作用就像地址或者说指针或者说偏移量
这个索引号就用来定位文件数据在内存中的位置.
这个概念在类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. BZOJ2640 : 可见区域

    设$base$表示直接能看到的面积,$f[i]$表示仅去掉线段$i$后新增的面积,$g[i][j]$表示仅去掉线段$i$和$j$后新增的面积. 删除一条线段的答案为$base+\max(f[i])$. ...

  2. Catalan 数列的性质及其应用(转载)

    转自:http://lanqi.org/skills/10939/ 卡特兰数 — 计数的映射方法的伟大胜利 发表于2015年11月8日由意琦行 卡特兰(Catalan)数来源于卡特兰解决凸$n+2$边 ...

  3. 创建一个git仓库

    1.git init 使用git init命令初始化一个git仓库,git仓库会生成一个.git目录 git init 1.使用指定的目录作为我们的git仓库 git init newrepo 2.初 ...

  4. JdbcTemplate实体映射

    JdbcTemplate实体映射 如果你需要使用JdbcTemplate将查询的数据映射成Java POJO,那么这篇文章适合你. 一个例子入门 下面是一个将表中一行记录映射成Map的例子,也是Jdb ...

  5. hbase数据原理及基本架构

    第一:hbase介绍 hbase是一个构建在hdfs上的分布式列存储系统: hbase是apache hadoop生态系统中的重要一员,主要用于海量结构化数据存储 从逻辑上讲,hbase将数据按照表. ...

  6. 为不具有change事件的html标签设置监听事件

    change事件会在文本内容或选项被更改时触发. 该事件仅适用于<input type="text">和<textarea>以及<select> ...

  7. sv时序组合和时序逻辑

    input a; input b; input c; reg d; wire e; reg f; // 时序逻辑,有寄存器 always@(posedge clk)begin 'b1)begin d ...

  8. [编译] 6、开源两个简单且有用的安卓APP命令行开发工具和nRF51822命令行开发工具

    星期四, 27. 九月 2018 12:00上午 - BEAUTIFULZZZZ 一.前言 前几天给大家介绍了如何手动搭建安卓APP命令行开发环境和nRF51822命令行开发环境,中秋这几天我把上面篇 ...

  9. JavaScript 异步编程的前世今生(上)

    前言 提到 JavaScript 异步编程,很多小伙伴都很迷茫,本人花费大约一周的业余时间来对 JS 异步做一个完整的总结,和各位同学共勉共进步! 目录 part1 基础部分 什么是异步 part2 ...

  10. Batch入门教程丨第一章:部署与Hello World!(上)

    Batch入门教程 在本教程中,您将了解并学习与Windows Batch有关的知识和编程方法,用以解决在日常生活中所遇到的简单问题,或者利用Windows Batch建立一个最初级的编程思维方式. ...