快捷搜索: 王者荣耀 脱发

IO第九回:FileDescriptor

IO第九回:FileDescriptor

标签: IO流


什么是FileDescriptor

public final class FileDescriptor extends Object

FileDescriptor是文件描述符类。

用FileDescriptor的对象来表示打开文件,开放套接字或其他字节源等。也就是说我们可以简单地将FileDescriptor的对象看成一个文件。

但是,我们不能直接把FileDescriptor当成文件来进行操作;若需要通过FileDescriptor对该文件进行操作,则需要新创建FileDescriptor对应的FileOutputStream,再对文件进行操作。

因此,文件描述符的主要用途是创建一个FileInputStream或FileOutputStream,来包含它。

成员变量

    static FileDescriptor err 标准错误流(屏幕)的描述符。 static FileDescriptor in 标准输入流(键盘)的描述符。 static FileDescriptor out 标准输出流(屏幕)的描述符。

构造方法

FileDescriptor public FileDescriptor() 构造(无效)FileDescriptor对象。 为什么说是无效的呢?我们看一下代码:

public /**/ FileDescriptor() {
        fd = -1;
        handle = -1;
    }

方法摘要

valid public boolean valid() 测试此文件描述符对象是否有效。true表示文件描述符对象有效,false表示无效

sync public void sync() throws SyncFailedException 强制所有系统缓冲区与底层设备同步。

静态变量详解

out详解

out是标准输出(屏幕)的描述符代表了标准输出(屏幕)。若我们要输出信息到屏幕上,即可通过out来进行操作。

但是我们看一下,在FileDescriptor类中,并没有什么方法来供我们操作。这是我们要注意API中的一句话:“文件描述符的主要用途是创建一个FileInputStream或FileOutputStream,来包含它。 ”

比如:

try {
    FileOutputStream fos = new FileOutputStream(FileDescriptor.out);
    fos.write(A);
    fos.close();
} catch (IOException e) {
    e.printStackTrace();
}

屏幕上输出字母’A’。

in详解

in与out原理类似,下面的代码实现System.in的功能

package charIO;

import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * Created by japson on 8/25/2017.
 */
public class SystemIOE {
          
   
    public static void testin() {
        FileInputStream fis = null;
        try {
            FileDescriptor fd = FileDescriptor.in;
            fis = new FileInputStream(fd);
            byte[] b = new byte[10];
            int len;
            while ((len = fis.read(b)) != -1) {
                String str = new String(b,0,len);
                System.out.print("fis.read() = " + str);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        testin();
    }
}

error详解

其实没什么详解的,并没有找到相关的资料。大抵是和前两种差不多,然后可以在打印流中提一下错误流

经验分享 程序员 微信小程序 职场和发展