一、FileDescriptor |
文件描述符类的实例用作与基础机器有关的某种结构的不透明句柄,该结构表示开放文件、开放套接字或者字节的另一个源或接收者。文件描述符的主要实际用途是创建一个包含该结构的 FileInputStream
或 FileOutputStream
。
二、静态标准文件描述符 |
(1)标准文件描述符
字段摘要 | |
---|---|
static FileDescriptor |
err 标准错误流的句柄。 |
static FileDescriptor |
in
标准输入流的句柄。 |
static FileDescriptor |
out
标准输出流的句柄。 |
标准流的源码
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 ",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的执行结果类似。