FileDescriptor的作用

来源:互联网 发布:小猪cms微信收银系统 编辑:程序博客网 时间:2024/06/16 10:08
一、FileDescriptor

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

 

二、静态标准文件描述符

(1)标准文件描述符

字段摘要static FileDescriptorerr
          标准错误流的句柄。static FileDescriptorin
          标准输入流的句柄。static FileDescriptorout
          标准输出流的句柄。

标准流的源码

public static final FileDescriptor in = standardStream(0);public static final FileDescriptor out = standardStream(1);public static final FileDescriptor err = standardStream(2); private static FileDescriptor standardStream(int fd) {        FileDescriptor desc = new FileDescriptor();        desc.handle = set(fd);        return desc;}private static native long set(int d);

 

 

(2)out 的作用和原理

out是标准输出(屏幕)的描述符。
通过创建out对应的OutputStream对象os,然后通过os的write()等输出接口就可以将信息输出到屏幕上。

try {    PrintWriter pw = new PrintWriter(new FileOutputStream(FileDescriptor.out));     pw.print("你好");    pw.flush();    pw.close(); } catch (Exception e) { }

 输出结果:你好

这与System.out.print()方法一样

 

三、文件流的FileDescriptor

(1)获取文件描述符Stream.getFD()

try {    // 打开文件,获取文件描述符    String fileName = "out.txt";    FileOutputStream os = new FileOutputStream(fileName);    FileDescriptor  fd = os.getFD();    System.out.println("file name: " + fileName);     //写数据入文件    byte[] data = "你好".getBytes();    os.write(data);    System.out.println("data: " + data);     // 刷新缓冲区,数据可能没有写入到磁盘     os.flush();     // 阻塞直到数据缓冲区的数据全部写入磁盘,该方法返回后,数据已经写入到磁盘    System.out.println("阻塞直到数据缓冲区的数据全部写入磁盘");    fd.sync();     // 关闭流    os.close();   } catch (IOException e) {    e.printStackTrace();}

 

(2)同一个文件描述符

String fileName="file.txt";try {      // 新建文件file.txt对应的FileOutputStream对象      FileOutputStream os1 = new FileOutputStream(fileName);      // 获取文件file.txt对应的FileDescriptor      FileDescriptor fd = os1.getFD();      // 根据FileDescriptor创建FileOutputStream对象      FileOutputStream os2 = new FileOutputStream(fd);      os1.write('a');    // 通过os1向file.txt中写入'a'      os2.write('b');    // 通过os1向file.txt中写入'b'     if (fd!=null)          System.out.printf("fd(%s) is %s\n",fd, fd.valid());     System.out.println(os1.getFD()==os2.getFD()); //true         os2.close();      os1.close();   } catch(IOException e) {      e.printStackTrace();  }

file.txt 中内容为ab

 

(3)不同文件描述符

String fileName="file.txt";try {      // 新建文件file.txt对应的FileOutputStream对象      FileOutputStream os1 = new FileOutputStream(fileName);               // 根据FileDescriptor创建FileOutputStream对象      FileOutputStream os2 = new FileOutputStream(fileName);      os1.write('a');    // 通过out1向file.txt中写入'a'      os2.write('b');   // 通过out1向file.txt中写入'b'              System.out.println(os1.getFD()==os2.getFD());    //false           os2.close();      os1.close();  } catch(IOException e) {      e.printStackTrace();  }    

file.txt 中内容为b

 

最后,FileInputStream 与FileOutputStream的执行结果类似。