Java的IO流

Java的IO流

一、JavaIO流简介

java的io流分为 字节流字符流

java I/O 流 主要由如下4个抽象类派生

  1. InputStream / OutputStream(字节流)
  2. Reader / Writer (字符流)

二、字节流

java字节流分为字节输入流和字节输出流

1. InputStream

​ InputStream 是所有字节输入流的父类,它有一下常用方法:

  • read()
  • read(byte b[])
  • read(byte b[], int off, int len)
  • skip(long n)
  • available()
  • close

虽然有指定长度的方法,但是其内部还是使用的read() 来单个字符读入的

​ InputStream有一些子类:

  • FileInputStream
try (InputStream fis = new FileInputStream("input.txt")) {
    System.out.println("Number of remaining bytes:"
            + fis.available());
    int content;
    long skip = fis.skip(2);
    System.out.println("The actual number of bytes skipped:" + skip);
    System.out.print("The content read from file:");
    while ((content = fis.read()) != -1) {
        System.out.print((char) content);
    }
} catch (IOException e) {
    e.printStackTrace();
}
  • ObjectInputStream
ObjectInputStream input = new ObjectInputStream(new FileInputStream("object.data"));
MyClass object = (MyClass) input.readObject();
input.close();
  • DataInputString
FileInputStream fileInputStream = new FileInputStream("input.txt");
//必须将fileInputStream作为构造参数才能使用
DataInputStream dataInputStream = new DataInputStream(fileInputStream);
//可以读取任意具体的类型数据
dataInputStream.readBoolean();
dataInputStream.readInt();
dataInputStream.readUTF();
  • ...

2. OutputStream

​ 与InputStream类似,OutputStream也是所有字节输出流的父类,其包含一下方法

  • write()

  • write(byte b[])

  • write(byte b[], int off, int len)

  • flush

  • close

    InputStream 与OutStream类似,其内部都是单个字节读写

​ 它的子类有:

  • FileOutputStream
  • ObjectOutputStream
  • DateOutputStream

3. BufferedInputStream/OutputStream

​ 由于InputStream 是每次单字节来读入的,性能很差,所以引入了缓存区,把读取的字节放在缓冲区来提高效率。

缓冲字符输入流使用装饰器模式来对字符输入流进行增强。他需要继承和实现字符输入流的接口和类,实现增强作用

三、字符流

1. Reader

​ Reader 是 所有字符输入流的父类,其内部方法与InputStream类似。

2. Writer

​ Writer 是所有 字符输出类的父类,其方法也与OutputStream类似,但是增加了

  • append(CharSequence csq)
  • append(char c)

3. BufferReader/Writer

​ 与缓冲字节流类似

四、Java为什么要分为字节流和字符流?

1. 数据类型不同

字节流是以字节(8位) 为单位处理数据。字节是计算机存储和处理数据的基本单位,所以字节流可以处理任何类型的数据,包括文本文件、图片、音频等。

字符流 是以字符(16位) 位单位进行处理,通常用于处理文本数据。在Java中字符使用Unicode编码(16位)。在处理时会对文本进行自动的解码编码操作,方便进行读写

2. 编码格式

字节流 不涉及编码问题,他只是单纯的读入写入字节数据,而字符流 则需要考虑编码问题

五、如何在字符流/字节流之间进行选择?

​ 字节流是更底层的流,它可以处理任何类型的数据

  • 对于分文本数据(图片,音频,视频) 使用字节流
  • 对与纯文本数据,并且需要按照字符进行读写,在使用字符流
posted @ 2025-03-28 11:38  aidan_8  阅读(58)  评论(0)    收藏  举报