• 初探java I/O 工作机制


    来自书籍:深入JAVA WEB技术内幕

    1.Java I/O类库的基本架构

    java的I/O操作类在包java.io下,大概有将近80多个类,大概可以分下面4组:

    • 基于字节操作的I/O接口: InputStream和OutPutStream
    • 基于字符操作的I/O接口:Writer和Reader
    • 基于磁盘操作的I/O接口:File
    • 基于网络操作的I/O接口:Socket

    前两组主要是传输数据的数据格式,后两组主要是传输数据的方式。

    1.1基于字节操作的I/O接口 InputStream 和OutPutStream

    InputStream接口常用方法 :

    int read(); 

    int available();

    int read(byte[] b) ;

    int read(byte[] b,int off,int l);

    OutputStream接口常用方法:

    close();

    flush();

    writer(byte[] b) ;

    writer(byte[] b,int off,int l);

    1.2基于字符的I/O操作的接口:Writer和Reader.

    I/O操作的最小存储单元是字节,但是由于我们程序中通常操作的是字符,所以提供了操作字符的I/O方法。

    Writer接口常用方法:

    writer(byte[] b);

    writer(byte[] b,int setOff,int l);

    writer(String s,int setOff,int l);

    writer(int i);

    flush();

    close();

    Reader接口常用方法:

    int read();

    int read(byte[] b);

    int read(byte[] b,int setOff,int l);

    void close();

    1.3字节与字符的转化接口

     数据持久化或网络传输都是以字节进行的,所以要懂得字节与字符之间相互转换。

     

    InputStreamReader类

    private final StreamDecord sd;  // 字符流和字节流的转换器.

     InputStreamReader 继承了Reader类, 重写了read() 和read(char[] c,int off,int l) 方法, 调用了sd的read() 和 read(char[] c,int off,int l) 方法。

    OutputStreamWriter 继承了Writer , 重写了writer()等方法。 

    点进去可以看到 StreamDecord 源码

    点进去可以看看 对应的使用和理解

    简单理解为:  InputStreamReader 和outputSteamWriter 是java提供的 字节和字符的转换器, 

    比如:

    文件 File file = new File(path);

    要对其操作 只能通过字节流 FileInputStream进行操作。 

    如果想要通过字符流 来操作, 就会用到转换器,FileReader(继承inputStreamReader) 或者InputStreamReader

    那么我是不是可以理解为 要对系统中文件操作, 就一定先要以字节流的形式获取呢?   

    1.4磁盘I/O的工作机制

    几种访问文件的方式:

    1.标准的访问/写入方式:

    访问:从物理磁盘复制数据至内核地址空间, 再由内核地址空间复制数据到用户地址空间

      内核地址空间会有相对应的缓存-高速缓存,如果内核地址空间有缓存所需要的数据时,就直接从内核地址空间复制到用户地址空间。

    写入:用户的应用程序调用write()接口将数据从用户地址空间复制到内核地址空间,用户程序所做的就到此,

      至于系统什么时候将内核地址空间的数据 写进磁盘中,那是系统决定的,除非显示的调用 sync同步命令。

    2.直接的I/O方式

    直接I/O访问方式, 就是越过了内核地址空间,直接从应用程序访问磁盘数据, 这样我们就少了一次数据的复制(从内核地址空间到用户地址空间)。

    当数据管理系统明确知道哪些数据需要缓存, 哪些数据应该失效,还可以对一些热点数据进行预加载,提前将热点数据加载到内存中,可以加快数据访问效率。

    (操作系统只会简单的缓存最近一次从磁盘读取的数据)

    这样直接的I/O访问方式肯定是有负面影响的,如果每次都直接从磁盘里读取数据的话,加载会很慢。

    3.内存映射方式

    操作系统内存某一块区域与磁盘的文件关联起来,当访问某一块区域时候,转换为访问文件的某部分数据。 这样,同样减少了从磁盘复制数据到内核地址空间这一步。

     1.5 JAVA访问磁盘文件

    卡!!!!!!!!!!!!!

     

  • 相关阅读:
    使用Fiddler模拟客户端http响应
    Vim显示行号
    Convert int to byte array
    bare linefeeds received in ASCII mode
    Memory Analyse Tool
    what is the difference between static and normal variables in c++
    Looper Could not create wake pip
    Convert Java Doc to CHM using jd2chm
    ARM(RISC)和x86(CISC)的技术差异
    处理器架构——从RISC与CISC到x86、ARM、MIPS
  • 原文地址:https://www.cnblogs.com/YYfish/p/6677516.html
Copyright © 2020-2023  润新知