FileDescriptor

Posted 平林新袖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FileDescriptor相关的知识,希望对你有一定的参考价值。

FileDescriptor 在java中的java.io包下面  

1 public final class FileDescriptor {
2 。。。
3 }

官方的解释:

  文件描述符类的实例用作与基础机器有关的某种结构的不透明句柄,该结构表示开放文件、开放套接字或者字节的另一个源或接收者。文件描述符的主要实际用途是创建一个包含该结构的 FileInputStream 或 FileOutputStream

  一坨~~~看不明白~

  在wiki中的描述

  是一个用于表述指向文件的引用的抽象化概念。在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIXLinux这样的操作系统。

   基于上面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介绍

  1. (01) in  -- 标准输入(键盘)的描述符  
  2. (02) out -- 标准输出(屏幕)的描述符  
  3. (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

以上是关于FileDescriptor的主要内容,如果未能解决你的问题,请参考以下文章

FileDescriptor详解

JDK 源码阅读 : FileDescriptor

java io系列09之 FileDescriptor详解

FileDescriptor

如何在 Android 中使用 JNI 将资产 FileDescriptor 正确传递给 FFmpeg

如何将 FileDescriptor 与 HTTP URL 一起使用