zoukankan      html  css  js  c++  java
  • FileDescriptor的作用

    一、FileDescriptor

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

    二、静态标准文件描述符

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

  • 相关阅读:
    maven 历史版本下载地址
    eclipse 热部署
    在线代码练习
    Intellij热部署插件JRebel
    模拟数据生成器
    电脑读取U盘总提示格式化
    变形金刚
    slamdunk正在做菜
    丧心病狂的计数
    小明在工作
  • 原文地址:https://www.cnblogs.com/maokun/p/6719666.html
Copyright © 2011-2022 走看看