JavaIO 知识小结

    技术2025-11-08  5

    一.  流:

    输入流(inputstream): 一个可以读取字节序列的对象;

    输出流(outputstream): 一个可以写入字节序列的对象;

     

    两大主要基类:

    面向单字节:      InputStream   ,   OutputStream   

    面向双字节:       Reader        ,   Writer

    对应的抽象方法:  read()        ,    write();

    说明:

    1.双字节的I/O主要面向Unicode编码设计的。

    2.abstract  int  read():

    该方法读取一个字节,并将结果返回;如果读到结束,返回-1

    例如:  FileInputStream read()方法将从文件中读取一个字符返回;

            Sytem.in 是一个预定的InputStream的子类的对象,可以接受键盘的输入;

    InputStreamReader的子类可以覆盖read()方法,自定义读入的方式。

    3.abstract  void  write():

    将字节写入到指定的输出位置。

    4. 不论是read方法还是write方法都能阻塞一个线程知道字节被真正地读入或写入。

       这意味着如果不能立即被读取或写入,java就会挂起这个调用的线程。

    5. 当完成对一个流的读取或写入后,就应该调用close()进行关闭. 关闭一个输出流也可以用刷新( flush() )输出流占用的缓冲区(即临时存储在缓冲区中等待形成较大数据包后再发送的那些字符)将它们发送出去。

    6. 基本的read(), write()

     

    Java.io.InputStream 的主要API

    Ø  abstract int read()

          读取一个字节的数据并将其返回,当读到流的结尾的时候,返回-1

    Ø  int read(byte[] b)

      将数据读到一个字节数组并返回读取的字节的实际数目,当达到流的结尾的时候,返回-1

      最多读取b.length个字节

    Ø  int read(byte[] b , int off, len)

      同上,增加条件限制。从数组boff位置开始读取,读取最大长度为len.

    long skip(long n)

        在输入流中跳过n个字节。返回实际跳过的字节数(如果到达末尾,返回可能小于n

    Ø  int available()

    返回可用的未阻塞的字节数

    Ø  void  close()

         关闭输入流

        

    Java.io.OutputStream 主要API

    Ø  abstract  void  write(int n)

       写入一个字节的数据;

    Ø  void write(byte[] b)

       写入数组b的数据;

    Ø  void write(byte[] b,int off,int len)

       写入数组b中某一范围的数据;

    Ø  void close()

       刷新并关闭输出流;

    Ø  void flush()

       刷新输出流,即将缓冲区中的所有数据发送到目的地.

     

    二. 常用的JAVA I/O

    Ø  InputStream :抽象类,是所有字节输入流的超类

    子类:

    n  ByteArrayInputStream:

    把字节数组转换为输入流,把内存中的一个缓冲区作为InputStream  使用

    n  FileInputStream:

    从文件中读取数据,把一个文件作为InputStream,实现对文件的读取操作

    n  PipedInputStream :

    连接一个PipedInputStream,实现了pipe的概念,主要在线程中使用

    n  SequenceInputStream :

    把几个输入流转换为一个输入流,把多个InputStream合并为一个InputStream

    n  ObjectInputStream:

    对象输入流

    n  FilterInputStream :

    装饰器,具有扩展其他输入流的功能

    Ø  OutputStream:抽象类,是所有字节输出流的超类

    子类:

    n   ByteArrayOutputStream :

    向字节数组(内存的缓冲区)中写数据,把信息存入内存中的一个缓冲区中

    n   FileOutputStream :

    向文件中写数据,把信息存入文件中

    n   PipedInputStream :

    向管道中输出数据,PipedInputStream搭配使用,实现了pipe的概念,主要在线程中使用

    n   ObjectOutputStream:

    对象输出流

    n   FilterOutputStream:

    装饰器,扩展其他输出流的功能

     

     

    Ø  字符流:   (处理字符流最大的问题是进行字符编码的转换)

    Reader :  读取字符流的抽象类

      子类:

    n  CharArrayReader:

    适配器,把字符数组转换为Reader,从字符数组中读取字符,与ByteArrayInputStream对应

    n  BufferedReader :

    装饰器,为其他的Reader提供缓冲区。

    n  LineNumberReader:

    装饰器,为其他的Reader提供缓冲区,并且可以跟踪字符输入流中的行号

    n  StringReader: 

    适配器,把字符串转换为Reader,从字符串中读取字符

    n  PipedReader:

    连接一个PipedWriter

    n  FilterReader:

    装饰器,扩展其他的Reader的功能

    n  InputStreamReader :

    适配器,把InputStream转换为Reader,可以指定数据源的字符编码

    n  FileReader:

    从文件中读取字符

     

    Ø      Writer :   写入字符流的抽象类

    子类:

    n  CharArrayWriter :

    适配器,把字符数组转换为Witer,向字符数组中写字符

    n  BufferedWriter;

    装饰器,为其他的Writer提供写缓冲区

    n  StringWriter:

    适配器,把StringBuffer转换为Writer,StringBuffer中写字符

    n  PipedWriter:

    连接一个PipedReader

    n  FilterWriter:

    装饰器,扩展其他的Writer的功能

    n  PringWriter:

    装配器,输出格式化数据

    n  OutputStreamWriter:

    适配器,把OutputStream 转换Writer ,可以指定数据汇的字符编码

    n  FileWriter:

    向文件中写字符

     

    最后心得,在用I/O的时候,应该先确认好字符的类型,选择适合的I/O,然后确认该类的构造参数。比如BufferInputStream,用来处理防止每次读取时候都得进行写操作,构造参数是InputStream。总之一句话:定字符类型,定构造参数。

     

    最新回复(0)