Java的IO流
Java的IO流
一、JavaIO流简介
java的io流分为 字节流和 字符流
java I/O 流 主要由如下4个抽象类派生
- InputStream / OutputStream(字节流)
- 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. 编码格式
字节流 不涉及编码问题,他只是单纯的读入写入字节数据,而字符流 则需要考虑编码问题
五、如何在字符流/字节流之间进行选择?
字节流是更底层的流,它可以处理任何类型的数据
- 对于分文本数据(图片,音频,视频) 使用字节流
- 对与纯文本数据,并且需要按照字符进行读写,在使用字符流

浙公网安备 33010602011771号