FileDescriptor 在java中的java.io包下面
1 public final class FileDescriptor { 2 。。。 3 }
官方的解释:
文件描述符类的实例用作与基础机器有关的某种结构的不透明句柄,该结构表示开放文件、开放套接字或者字节的另一个源或接收者。文件描述符的主要实际用途是创建一个包含该结构的 FileInputStream
或 FileOutputStream
。
一坨~~~看不明白~
在wiki中的描述
是一个用于表述指向文件的引用的抽象化概念。在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。
基于上面filedescriptor在java中,是当应用程序打开一个文件或者建立一个socket连接的时候,内核返回给应用程序一个非负的整数(In,out,err,分别为0,1,2),使用这个称之为filedescriptor的东西来实现对文件或者socket的操作。
【一网友的解释】【赞】打开文件或者socket之后给你一个fd,然后你可以拿着fd去操作文件或者socket,也可以把这个fd做为参数传来传去。你不能把文件或者socket“本身”作为一个参数传给一个函数吧,传fd就可以,因为它就是一个类似指针的东西。函数里面就根据这个fd对这同一个文件或者已经建立的socket连接进行操作。
之所以socket和文件都有fd的原因是都可以在上面做打开,关闭,读,写等等操作。
在获取了filedescriptor之后,可以对文件或socket的操作:
in, out, err介绍
- (01) in -- 标准输入(键盘)的描述符
- (02) out -- 标准输出(屏幕)的描述符
- (03) err -- 标准错误输出(屏幕)的描述符
它们3个的原理和用法都类似,下面我们通过out来进行深入研究。
out 的作用和原理
out是标准输出(屏幕)的描述符。但是它有什么作用呢?
我们可以通俗理解,out就代表了标准输出(屏幕)。若我们要输出信息到屏幕上,即可通过out来进行操作;但是,out又没有提供输出信息到屏幕的接口(因为out本质是FileDescriptor对象,而FileDescriptor没有输出接口)。怎么办呢?
很简单,我们创建out对应的“输出流对象”,然后通过“输出流”的write()等输出接口就可以将信息输出到屏幕上。如下代码:
1 try { 2 FileOutputStream out = new FileOutputStream(FileDescriptor.out); 3 out.write("hello".getBytes()); 4 out.close(); 5 } catch (IOException e) { 6 }
执行上面的程序之后会在屏幕上打印出hello。但是为了方便我们操作,java早已经帮我们完成了操作的封装,通过System.out.println("hello")。
【参考】http://www.fengfly.com/plus/view-214059-1.html
https://ruby-china.org/topics/161
https://zh.wikipedia.org/wiki/%E6%96%87%E4%BB%B6%E6%8F%8F%E8%BF%B0%E7%AC%A6