• io流简单介绍


    io流简介

    • InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
    • OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

    inputStream字节输入流

    • inputStrieam用于从源头读取数据(字节信息)到内存中,java.io.inputStream抽象类是所有字节输入流的父类
    • read():返回输入流中下一个字节的数据,返回值介于0到255之间,如果魏都区任何字节,则代码返回-1,表示文件结束
    • read(byte b[])从输入流中读取可以先字节存储到数据b中如果数据b的长度为0,则最多读取的字节数最多等于b.length返回得去的字节数,这个等价与read(b,0,b.length)
    • read(byte b[], int off, int len) :在read(byte b[ ]) 方法的基础上增加了 off 参数(偏移量)和 len 参数(要读取的最大字节数)。
    • skip(long n) :忽略输入流中的 n 个字节 ,返回实际忽略的字节数。
    • available() :返回输入流中可以读取的字节数。
    • close() :关闭输入流释放相关的系统资源。

    从 Java 9 开始,InputStream 新增加了多个实用的方法:

    • readAllBytes() :读取输入流中的所有字节,返回字节数组。

    • readNBytes(byte[] b, int off, int len) :阻塞直到读取 len 个字节。

    • transferTo(OutputStream out) : 将所有字节从一个输入流传递到一个输出流。

    • FileInputStream 是一个比较常用的字节输入流对象,可直接指定文件路径,可以直接读取单字节数据,也可以读取至字节数组中。

    • 不过,一般我们是不会直接单独使用 FileInputStream ,通常会配合 BufferedInputStream(字节缓冲输入流,后文会讲到)来使用。下面就是常见的一组代码

    • // 新建一个 BufferedInputStream 对象
      BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("input.txt"));
      // 读取文件的内容并复制到 String 对象中
      String result = new String(bufferedInputStream.readAllBytes());
      System.out.println(result);
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • DataInputStream 用于读取指定类型数据,不能单独使用,必须结合 FileInputStream 。也需要传入fileinputStream对象然后使用,

    • ObjectInputStream 用于从输入流中读取 Java 对象(反序列化),ObjectOutputStream 用于将对象写入到输出流(序列化)。也需要传入fileinputStream对象然后使用

    OutputStream(字节输出流)

    • OutputStream用于将数据(字节信息)写入到目的地(通常是文件),java.io.OutputStream抽象类是所有字节输出流的父类。

    • write(int b) :将特定字节写入输出流。

    • write(byte b[ ]) : 将数组b 写入到输出流,等价于 write(b, 0, b.length)

    • write(byte[] b, int off, int len) : 在write(byte b[ ]) 方法的基础上增加了 off 参数(偏移量)和 len 参数(要读取的最大字节数)。

    • flush() :刷新此输出流并强制写出所有缓冲的输出字节。

    • close() :关闭输出流释放相关的系统资源。

    • FileOutputStream 是最常用的字节输出流对象,可直接指定文件路径,可以直接输出单字节数据,也可以输出指定的字节数组。

    • FileOutputStream fileOutputStream = new FileOutputStream("output.txt");
      BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream)
      
      • 1
      • 2
    • 类似于 FileInputStreamFileOutputStream 通常也会配合 BufferedOutputStream(字节缓冲输出流,后文会讲到)来使用。

    • DataOutputStream 用于写入指定类型数据,不能单独使用,必须结合

    • ObjectOutputStream 用于从输入流中读取 Java 对象(ObjectInputStream,反序列化)或者将对象写入到输出流(ObjectOutputStream,序列化)。

    Reader(字符输入流)

    • 不管是文件读写还是网络发送接收,信息的最小存储单元都是字节。 那为什么 I/O 流操作要分为字节流操作和字符流操作呢?
    • 字符流是由java虚拟机将字节转换得到的,这个过程比较耗时
    • 如果我们不知奥编码类型就很容易出现乱码问题
    • 因此io流就干脆提供了一个直接操作字符的接口,方便我们平时对字符进行操作
    • 音频文件、图片等媒体文件用字节流比较好,如果涉及到字符的话使用字符流比较好。
    • 常用字符编码所占字节数?utf8 :英文占 1 字节,中文占 3 字节,unicode:任何字符都占 2 个字节,gbk:英文占 1 字节,中文占 2 字节
    • Reader用于从源头(通常是文件)读取数据(字符信息)到内存中,java.io.Reader抽象类是所有字符输入流的父类。
    • Reader 用于读取文本, InputStream 用于读取原始字节。
    • read() : 从输入流读取一个字符。
    • read(char[] cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中,等价于 read(cbuf, 0, cbuf.length)
    • read(char[] cbuf, int off, int len) :在read(char[] cbuf) 方法的基础上增加了 off 参数(偏移量)和 len 参数(要读取的最大字节数)。
    • skip(long n) :忽略输入流中的 n 个字符 ,返回实际忽略的字符数。
    • close() : 关闭输入流并释放相关的系统资源。
    • InputStreamReader 是字节流转换为字符流的桥梁,其子类 FileReader 是基于该基础上的封装,可以直接操作字符文件。

    Writer(字符输出流)

    Writer用于将数据(字符信息)写入到目的地(通常是文件),java.io.Writer抽象类是所有字节输出流的父类。

    Writer 常用方法 :

    • write(int c) : 写入单个字符。
    • write(char[] cbuf) :写入字符数组 cbuf,等价于write(cbuf, 0, cbuf.length)
    • write(char[] cbuf, int off, int len) :在write(char[] cbuf) 方法的基础上增加了 off 参数(偏移量)和 len 参数(要读取的最大字节数)。
    • write(String str) :写入字符串,等价于 write(str, 0, str.length())
    • write(String str, int off, int len) :在write(String str) 方法的基础上增加了 off 参数(偏移量)和 len 参数(要读取的最大字节数)。
    • append(CharSequence csq) :将指定的字符序列附加到指定的 Writer 对象并返回该 Writer 对象。
    • append(char c) :将指定的字符附加到指定的 Writer 对象并返回该 Writer 对象。
    • flush() :刷新此输出流并强制写出所有缓冲的输出字符。
    • close():关闭输出流释放相关的系统资源。
    • OutputStreamWriter 是字符流转换为字节流的桥梁,其子类 FileWriter 是基于该基础上的封装,可以直接将字符写入到文件。

    字节缓冲流

    • IO 操作是很消耗性能的,缓冲流将数据加载至缓冲区,一次性读取/写入多个字节,从而避免频繁的 IO 操作,提高流的传输效
    • BufferedInputStream 从源头(通常是文件)读取数据(字节信息)到内存的过程中不会一个字节一个字节的读取,而是会先将读取到的字节存放在缓存区,并从内部缓冲区中单独读取字节。这样大幅减少了 IO 次数,提高了读取效率。
    • BufferedInputStream 内部维护了一个缓冲区,这个缓冲区实际就是一个字节数组,通过阅读 BufferedInputStream 源码即可得到这个结论。
    • BufferedOutputStream 将数据(字节信息)写入到目的地(通常是文件)的过程中不会一个字节一个字节的写入,而是会先将要写入的字节存放在缓存区,并从内部缓冲区中单独写入字节。这样大幅减少了 IO 次数,提高了读取效率
    • 类似于 BufferedInputStreamBufferedOutputStream 内部也维护了一个缓冲区,并且,这个缓存区的大小也是 8192 字节。

    字符缓冲流

    BufferedReader (字符缓冲输入流)和 BufferedWriter(字符缓冲输出流)类似于 BufferedInputStream(字节缓冲输入流)和BufferedOutputStream(字节缓冲输入流),内部都维护了一个字节数组作为缓冲区。不过,前者主要是用来操作字符信息。

    打印流

    • System.out 实际是用于获取一个 PrintStream 对象,print方法实际调用的是 PrintStream 对象的 write 方法。
    • PrintStream 属于字节打印流,与之对应的是 PrintWriter (字符打印流)。PrintStreamOutputStream 的子类,PrintWriterWriter 的子类。

    随机访问流

  • 相关阅读:
    if-else:if判断语句和执行语句之间相差1个时钟周期吗?并行执行吗?有优先级吗?
    双馈风力发电机-900V直流混合储能并网系统Simulink仿真
    AI安全入门-人工智能数据与模型安全
    CSS文字文本样式总结
    Ribbon负载均衡 (源码分析)
    信息系统综合测试与管理
    File类
    二合一的集度,任重道远
    AWK语言第二版 2.3转换
    【业务架构】价值实现、价值定位、价值创造
  • 原文地址:https://blog.csdn.net/reresrse/article/details/126443739