FileDescriptor的作用

一、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的执行结果类似。

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值