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();
    }
  }
}

Java IO(三)FileDescriptor的更多相关文章

  1. java IO(三):字符流

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  2. Java IO(三)

    File File类的常见方法: 1.创建. boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false.和输出流不一样,输出流对象一建立就创建文 ...

  3. Java IO(三)--字节流基本使用

    I/O流分类: InputStream和Read的子类都有read(),用来读取单个字节或字节数组 OutputStream和write的子类都有write(),用来写入单个字节或字节数组 一般都是通 ...

  4. 系统学习 Java IO (三)----文件类 File

    目录:系统学习 Java IO---- 目录,概览 Java IO API 中的 File 类可以访问基础文件系统. 使用 File 类,可以: 检查文件或目录是否存在. 如果目录不存在,创建一个目录 ...

  5. Java IO(三) 之 FileInputStream

    前言: 对于文件系统中的文件.都能够使用FileInputStream流类以二进制的形式进行读取.可是因为Java本身的定位在JVM之上,没有处理计算机底层的能力.因此一些涉及底层处理的方法都是使用n ...

  6. java io系列09之 FileDescriptor总结

    本章对FileDescriptor进行介绍 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_09.html FileDescriptor 介绍 Fil ...

  7. 系统学习 Java IO ---- 目录,概览

    Java IO 类的系统教程,原创.主要参考自英文教程 Java IO Tutorial 和 Java Doc. http://tutorials.jenkov.com/java-io/index.h ...

  8. Java IO 学习(五)跟踪三个文件IO方法的调用链

    假设我们想要用Java读取一个二进制文件,有好几种方式,本文会选取其中比较典型的三种方式进行详细分析 0. 准备工作 安装openjdk-1.8.0.141(普通的jdk中涉及IO的很多代码是闭源的, ...

  9. Java IO流学习总结三:缓冲流-BufferedInputStream、BufferedOutputStream

    Java IO流学习总结三:缓冲流-BufferedInputStream.BufferedOutputStream 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/ ...

随机推荐

  1. postman(环境设置)

    1.点击小齿轮进入到环境变量添加页面,点击add添加环境变量 2.新增环境输入变量名称和变量值 3.添加成功 4.接口中设置变量,切换环境进行传参 5.调用环境变量断言 调用环境变量中的phone变量 ...

  2. Android 讯飞语音听写SDK快速接入(附空指针解决和修改对话框文字方法)

    1.账号准备工作 首先要有一个讯飞的账号啦,为后面申请APPID.APPKey等东西做准备.顺带一提:讯飞对不同认证类型用户开 放的SDK的使用次数是有不同的,详情如下图. 账号申请完成后,需要去你自 ...

  3. Redis系列(六):设置/移除键的过期时间

    本篇博客是Redis系列的第6篇,主要讲解以下内容: 数据库数量 切换目标数据库 设置键的过期时间 移除键的过期时间 本系列的前5篇可以点击以下链接查看: Redis系列(一):Redis简介及环境安 ...

  4. 工具类CountDownLatch的应用---百米赛跑案例

    package com.aj.thread; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Execu ...

  5. java基础篇 之 位运算符

    按位操作符 ​ 按位操作符用来操作基本数据类型中的单个"比特"(bit),即二进制位.按位操作符会对两个参数中对应的位执行布尔代数运算,并最终生成一个结果. ​ 我们常用的按位操作 ...

  6. css实现文字相对于图片垂直居中

    一 要实现的样式,文字在图片的垂直居中位置 二 实现的代码: <style> .flag{ position: absolute; bottom: 0; width: 23rem; hei ...

  7. 自动化测试po模式是什么?自动化测试po分层如何实现?-附详细源码

    一.什么是PO模式 全称:page object model  简称:POM/PO PO模式最核心的思想是分层,实现松耦合!实现脚本重复使用,实现脚本易维护性! ​ 主要分三层: 1.基础层BaseP ...

  8. Sharding JDBC整合SpringBoot 2.x 和 MyBatis Plus 进行分库分表

    Sharding JDBC整合SpringBoot 2.x 和 MyBatis Plus 进行分库分表 交易所流水表的单表数据量已经过亿,选用Sharding-JDBC进行分库分表.MyBatis-P ...

  9. Python脚本:linux上将筛选的文件夹复制到另一个目录,保存目录结构以及文件和文件夹操作方法

    import os,shutil def newDir(dir_path): if not os.path.exists(dir_path): os.makedirs(dir_path) def co ...

  10. Mysql 常用函数(10)- strcmp 函数

    Mysql常用函数的汇总,可看下面系列文章 https://www.cnblogs.com/poloyy/category/1765164.html strcmp 的作用 比较两个字符串的顺序是否完全 ...