浅谈Java IO流

发布于:2024-04-17 ⋅ 阅读:(33) ⋅ 点赞:(0)

Java中的IO流(Input/Output streams)是Java程序用来处理数据输入和输出的核心工具集。IO流抽象了数据流动的概念,允许Java程序与外部世界进行数据交换,无论是从文件、网络、键盘输入还是向屏幕、文件或网络发送数据。Java IO流按照处理数据的不同类型和方向,可以分为以下几个关键类别:

  1. 字节流(Byte Streams)
    • java.io.InputStreamjava.io.OutputStream 是所有字节流的顶层抽象接口,分别表示字节输入流和字节输出流。这类流主要用于处理原始的二进制数据,如图片、音频、视频等非文本文件。
    • 具体的实现类包括 FileInputStreamFileOutputStream 用于读写文件,ByteArrayInputStreamByteArrayOutputStream 用于内存中的字节数组操作,还有 BufferedInputStreamBufferedOutputStream 等缓冲流,提供了数据读写的缓冲功能,提升效率。
  2. 字符流(Character Streams)
    • java.io.Readerjava.io.Writer 是字符流的顶级接口,用于处理字符数据,即文本数据。
    • 具体实现类如 FileReaderFileWriter 用于读写文本文件,BufferedReaderBufferedWriter 则提供了缓存功能,还有 CharArrayReaderCharArrayWriter 用于内存中的字符数组操作。
  3. 节点流与处理流
    • 节点流 直接与数据源或目的地相连,例如读取硬盘文件或写入网络套接字的数据流。
    • 处理流包装流 并不直接连接到数据源或目的地,而是在已有节点流的基础上添加额外功能,如过滤、格式转换、缓冲等。例如 DataInputStreamDataOutputStream 用于数据的序列化和反序列化,PrintStream 提供了格式化的输出能力,GZIPOutputStreamGZIPInputStream 则实现了数据的压缩和解压。
  4. 高级IO流(NIO)
    • 自Java 1.4以来引入了New IO(NIO),提供了新的通道(Channel)和缓冲区(Buffer)API,允许非阻塞的、面向缓冲的IO操作。例如 java.nio.channels.FileChannel 可以用于高性能的文件读写操作。

Java提供了大量的类来支持IO操作,下表给大家介绍了其中比较常用的一些类。其中,黑色字体的是抽象基类,其他所有的类都继承自它们。红色字体的是节点流,蓝色字体的是处理流。
在这里插入图片描述
根据命名很容易理解各个流的作用:

  • 以File开头的文件流用于访问文件;

  • 以ByteArray/CharArray开头的流用于访问内存中的数组;

  • 以Piped开头的管道流用于访问管道,实现进程之间的通信;

  • 以String开头的流用于访问内存中的字符串;

  • 以Buffered开头的缓冲流,用于在读写数据时对数据进行缓存,以减少IO次数;

  • InputStreamReader、InputStreamWriter是转换流,用于将字节流转换为字符流;

  • 以Object开头的流是对象流,用于实现对象的序列化;

  • 以Print开头的流是打印流,用于简化打印操作;

  • 以Pushback开头的流是推回输入流,用于将已读入的数据推回到缓冲区,从而实现再次读取;

  • 以Data开头的流是特殊流,用于读写Java基本类型的数据。

注意:
Java IO流的设计遵循了装饰器模式,允许我们通过组合不同类型的流来实现复杂的数据处理任务。在使用流的时候,需要关注资源的有效管理和异常处理,通常会使用try-with-resources语句来确保流在使用完毕后会被正确关闭。