zoukankan      html  css  js  c++  java
  • Java IO(三)FileDescriptor

    Java IO(三)FileDescriptor

    一、介绍

    FileDescriptor 是文件描述符,用来表示开放文件、开放套接字等。当 FileDescriptor 表示文件时,我们可以通俗的将 FileDescriptor 看成是该文件,但是不能直接通过 FileDescriptor 对该文件进行操作,若要通过 FileDescriptor 对该文件进行操作,则需要新创建 FileDescriptor 对应的 FileOutputStream 或 FileInputStream,然后再对文件进行操作。

    二、主要静态常量:in、out、err

    in:标准输入标识符
    out:标准输出标识符
    err:标准错误标识符

    这三个标识符的原理都相似,下面以 out 为例 

    三、out 原理和作用

    (一)作用

    out 是标准输出的描述符。
    我们可以通俗理解,out 就代表了标准输出(外部设备)。若我们要输出信息到外部设备,如屏幕上,即可通过 out 来进行操作;但是,out 又没有提供输出信息到屏幕的接口(因为 out 本质是FileDescriptor 对象,而 FileDescriptor 没有输出接口)。
    我们可以创建out对应的“输出流对象”,然后通过输出流对象的 write() 等输出接口就可以将信息输出到屏幕上。

    try {
      FileOutputStream fos = new FileOutputStream(FileDescriptor.out);
      fos.write('a');
      fos.close();
    }catch(Exception e) {
      e.printStackTrace();
    }

    执行上面代码,可以看到屏幕输出了 ‘a’,此功能相当于 System.out.println() 。

    (二)、原理

    public final class FileDescriptor {
        private long handle;
        public static final FileDescriptor out = standardStream(1);
        private static FileDescriptor standardStream(int fd) {
            FileDescriptor desc = new FileDescriptor();
            desc.handle = set(fd);
            return desc;
        }
      ......
    }

    从源码中,可以看出
    1、out就是一个FileDescriptor对象。它是通过构造函数FileDescriptor(int fd)创建的。
    2、standardStream(int fd)的操作:就是给fd对象(int类型)赋值,fd对象是非常重要的一个变量,“fd = 1”就代表了“标准输出”,“fd = 0”就代表了“标准输入”,“fd = 2”就代表了“标准错误输出”。

    FileOutputStream out = new FileOutputStream(FileDescriptor.out); 就是利用standardStream(1)方法来创建“FileDescriptor.out对应的FileOutputStream对象”。

    通过上面的学习,我们知道,我们可以自定义标准的文件描述符[即,in(标准输入),out(标准输出),err(标准错误)]的流,从而完成输入/输出功能;但是,java已经为我们封装好了相应的接口,即我们可以更方便的System.in, System.out, System.err去使用它们。

    四、实例

    public static void main(String[] args) {
      FileInputStream in = null;
      FileOutputStream out = null;
      FileOutputStream err = null;
      try {
        in = new FileInputStream(FileDescriptor.in);
        int a = in.read();// 标准输入
        out = new FileOutputStream(FileDescriptor.out);
        out.write(a);// 标准输出
        err = new FileOutputStream(FileDescriptor.err);
        err.write(a);// 标准错误输出
      }catch(Exception e) {
        e.printStackTrace();
      }finally {
        try {
          if(in != null) {
            in.close();
          }
          if(out != null) {
            out.close();
          }
          if(err != null) {
            err.close();
          }
        }catch(Exception e) {
          e.printStackTrace();
        }  
      }
    }
  • 相关阅读:
    C#计算一段程序运行时间的三种方法
    jquery easyui combobox设置默认选中第一项
    ASP.NET Web API教程 分页查询
    ASP.NET Web Api 实现数据的分页
    开源.net 混淆器ConfuserEx介绍
    C#软件license管理(简单软件注册机制)
    MyBatis入门实例-包括实体类与数据库字段对应&CLOB字段处理
    MyBatis在insert插入操作时返回主键ID的配置
    MyBatis框架——mybatis插入数据返回主键(mysql、oracle)
    关于java中split的使用
  • 原文地址:https://www.cnblogs.com/lingq/p/12917196.html
Copyright © 2011-2022 走看看