IO
一、基本介绍
1.1 什么是流
- 概念:内存与存储设备之间传输数据的通道
1.2 流的分类
- 按文件存储
- 输入流:将<存储设备>中的内容读入到<内存>中
- 输出流:将<内存>中的内容写入到<储存设备>中
- 按单位
- 字节流:以字节为单位,可以读写所有数据
- 字符流:以字符为单位,只能读写文本数据
- 按功能
- 节点流:具有实际传输数据的读写功能
- 过滤流:在节点流的基础之上增强功能
二、字节流
2.1 字节流
-
字节流的父类(抽象类):
-
InputStream:字节输入流
方法 作用 close() 关闭流 read() 从输入流中读取数据的下一个字节 read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组中 -
OutputStream:字节输出流
方法 作用 close() 关闭流 flush() 刷新此输出流并强制写出所有缓冲的输出字节 write(byte[] b) 将b.length个字节从指定的byte数组写入此输出流
-
2.2 文件字节流
-
FileInputStream:
方法 作用 read(byte[] b) 从流中读取多个字节,将读到的内容存入b数组,返回实际读到的字节数;如果达到文件的尾部,则返回-1 -
FileOutputStream:
- 构造(路径,是否追加)
方法 作用 write(byte[] b) 一次写多个字节,将b数组中所有字节写入输出流
2.3 字节缓冲流
-
BufferedInputStream:
构造方法(参数) 作用 BufferedInputStream(InputStream in) BufferedInputStream(InputStream in, int size) size缓冲区大小 -
BufferedOutputStream:
同上
2.4 对象流
作用:
- 将对象储存到硬盘中或从硬盘中读取对象
- 对象存储和读取时需要序列化与反序列化
- 自带缓冲区
- 要想序列化对象,该对象必须要实现Serializable接口
- transient修饰字段,该字段不能被序列化
- 静态属性不能被序列化
-
ObjectOutputStream:
方法 作用 writeObject(Object obj) 将对象写入流 -
ObjectInputStream:
需要抛异常:ClassNotFoundException
方法 作用 readObject() 将对象从流中读出
三、字符流
3.1 字符编码
- ISO-8859-1收录除ASCII外,还包括西欧、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号(1字节)
- UTF-8 针对Unicode码表的可变长度字符编码(1、2或3个字节)
- GB2312 简体中文(1、2字节)
- GBK 简体中文、扩充(1、2字节)
- BIG5 台湾,繁体中文
注意:
byte[] bytes = inputStream.readAllBytes();
String s = new String(bytes);
在new String(bytes)中,String类会默认将byte数组中的数据按照UTF-16编码进行编译
可以使用String(byte[],Charset charset)构造,添加UTF-8编码
byte[] bytes = inputStream.readAllBytes();
String s = new String(bytes,StandardCharsets.UTF_8);
3.2字符流父类(抽象类)
-
Reader
方法 作用 read() read(char[] c) read(char[] c,int off,int len) -
Writer
方法 作用 write(int n) write(String str) write(char[] c)
3.3 文件字符流
-
FileReader
构造器 描述 FileReader(File file)
使用平台 FileReader
,在File
读取时创建一个新的 FileReader 。FileReader(FileDescriptor fd)
使用平台 default charset创建一个新的 FileReader
,给定FileDescriptor
进行读取。FileReader(File file, Charset charset)
创建一个新的 FileReader
,给出File
读取和charset 。FileReader(String fileName)
使用平台 default charset创建一个新的 FileReader
,给定要读取的文件的 名称 。FileReader(String fileName, Charset charset)
给定要读取的文件的名称和 FileReader
,创建一个新的FileReader 。方法 作用 read(char[] c) 从流中读取多个字符,将读取到的内容存储在数组中,返回实际读到的字符数,读到末尾返回-1 -
FileWriter
变量和类型 方法 描述 void
flush()
刷新流。 void
write(char[] cbuf, int off, int len)
写一个字符数组的一部分。 void
write(int c)
写一个字符。 void
write(String str, int off, int len)
写一个字符串的一部分。 void
write(String str)
将str写入
3.4 字符缓冲流
-
BufferedReader
构造器 描述 BufferedReader(Reader in)
创建使用默认大小的输入缓冲区的缓冲字符输入流。 BufferedReader(Reader in, int sz)
创建使用指定大小的输入缓冲区的缓冲字符输入流。 变量和类型 方法 描述 Stream<String>
lines()
返回 Stream
,其元素是从此BufferedReader
读取的行。void
mark(int readAheadLimit)
标记流中的当前位置。 boolean
markSupported()
判断此流是否支持mark()操作。 int
read()
读一个字符。 int
read(char[] cbuf, int off, int len)
将字符读入数组的一部分。 String
readLine()
读一行文字。 boolean
ready()
判断此流是否可以读取。 void
reset()
将流重置为最新标记。 long
skip(long n)
跳过字符。 -
BufferedWriter
构造器 描述 BufferedWriter(Writer out)
创建使用默认大小的输出缓冲区的缓冲字符输出流。 BufferedWriter(Writer out, int sz)
创建一个使用给定大小的输出缓冲区的新缓冲字符输出流。 变量和类型 方法 描述 void
flush()
刷新流。 void
newLine()
写一个行分隔符。 void
write(char[] cbuf, int off, int len)
写一个字符数组的一部分。 void
write(int c)
写一个字符。 void
write(String s, int off, int len)
写一个字符串的一部分。