IO流概念
任何事物都有一个分类标准,IO流的常见分类标准是按照 **流动方向 **和 **操作数据单位 **来分的。
1.流动方法:输入 输出(以程序为基准)
2.操作单位:字节(8bit-011b) 字符(ab)
| 操作单位流动方向 | 输入流 | 输出流 |
|---|---|---|
| 字节流 | InputStream(抽象类) | OutputStream(抽象类) |
| 字符流 | Reader | Writer |
关流操作:交互完成后关闭管道,任何时候发生异常也要关闭,不然一直占用资源。
字节流
字节流输入流 FileInputStream
- 因为字节流输入流InpuStream是抽象类,所以需要使用下面的子类
FileInputSteam - 字节流用的
广泛,视频和音频等都可,字符流用在中文还可 - 在最后要关流, 方法:对象名.close()
读取文件内容
构造方法
| 标题 | |
|---|---|
| FileInputStream(File file) | 表示从file指向的文件中读取,会校验路径合法性 |
FileInputStream(String name) | name表示文件的路径名(路径+文件名) |
读取中文乱码
一个中文是两个字节,字节流read()一次只能读取一个字节,为了得到后面的字,可以定义数组的长度
在控制台输出不能直接打印,需要使用String方法把byte数组转换成字符串,不然还是直接打印每个字节(乱码)
整体代码举例
字节流输出流 FileOutputStream
- 因为字节流输入流OutpuStream是抽象类,所以需要使用下面的子类
FileOutputSteam - FileOutputStream 会
自动创建一个文件(如果文件不存在,并且文件的路径存在的)
写数据进文件
构造方法
| 构造方法 | 描述 |
|---|---|
| FileOutputStream(File file) | 覆盖 |
| FileOutputStream(String name) | 覆盖,常用 ,name表示文件的路径名(路径+文件名 |
| FileOutputStream(File file, boolean append追加) | append追加 |
整体代码举例
文件拷贝
字符流
- 不适用于复制操作视频、音频等文件,主要用来操作
中文文档 - 构造方法和方法和字节流输入流FileInputStream非常类似,差别就是单位是char
文件输入流FileReader
构造方法
| 标题 | 描述 |
|---|---|
| FileReader(FileDescriptor fd) | 创建一个新的 FileReader ,给定 FileDescriptor读取 |
文件输出流FileWriter
构造方法
| 标题 | 描述 |
|---|---|
| FileReader(String fileName) | 创建一个新的 FileReader ,给定要读取的文件的名称 |
特有的方法:可以直接写字符串
void write(String str) 写入字符串。
void write(String str, int off, int len) 写入字符串的一部分
字节流和字符流的区别
-
操作的单位不一样,一个是字节,一个是字符
-
字节流更适合操作中文文档,字符流应用广泛:文本、图片、视频、音频等
-
以后只有读取文件中文本内容或者向文件中输出文本内容的时候,才使用字符流**,其他情况全部使用字节流 -
字符串有
直接写字符串的方法 -
字节输出流 : 程序 ---> 磁盘文件 如果不关闭流也会写入
字符输出流 : 程序 ---> 缓冲 ---> 磁盘文件 如果不关闭流或者刷新缓冲区,不会写入文件
字符输出流,关闭的时候会先刷新,关闭之后不能够在操作,刷新之后可以继续操作
什么时候会用到刷新 : 写入的数据,比较多,可以在中途手动调用刷新的方法提交数据
转换流
字节流转字符流 InputStreamReader
将字节流转换为字符流,是Reader的子类,把它当做一个特殊的Reader
构造方法
| 构造方法 | 描述 |
|---|---|
| InputStreamReader(InputStream in) | 创建一个使用默认字符集的InputStreamReader |
| InputStreamReader(InputStream in, Charset cs) | 创建一个使用给定字符集的InputStreamReader |
| InputStreamReader(InputStream in, String charsetName) | 创建一个使用命名字符集的InputStreamReader |
举例
缓冲流
之前集中循环的读写数据,操作磁盘次数非常多,影响性能,通过缓冲流,可以先缓存大量读写数据,等达到一定数量后,再链接磁盘进行读写操作,达到高效读写效果
字节流缓冲流举例
字符流缓冲流举例
打印流
关流方式
第一种
使用try/catch/finally,在finally里面写关流(先写输出,后写输入,切记不可把两个关流一起try)
第二种
使用try(需要关流的代码){}catch{}(不需要finally)
举例
乱码问题
- 本身字符编码不支持某种语言(比如中文)
- 字符编码不一致,常见的字符编码较多,我们常用的是
UTF-8