IO流

104 阅读4分钟

IO流概念

任何事物都有一个分类标准,IO流的常见分类标准是按照 **流动方向 **和 **操作数据单位 **来分的。

1.流动方法:输入 输出(以程序为基准

2.操作单位:字节(8bit-011b) 字符(ab)

操作单位流动方向输入流输出流
字节流InputStream(抽象类)OutputStream(抽象类)
字符流ReaderWriter

关流操作:交互完成后关闭管道,任何时候发生异常也要关闭,不然一直占用资源。

字节流

字节流输入流 FileInputStream

  • 因为字节流输入流InpuStream是抽象类,所以需要使用下面的子类FileInputSteam
  • 字节流用的广泛,视频和音频等都可,字符流用在中文还可
  • 在最后要关流, 方法:对象名.close()

读取文件内容

构造方法

标题
FileInputStream(File file)表示从file指向的文件中读取,会校验路径合法性
FileInputStream(String name)name表示文件的路径名(路径+文件名)

image.png

读取中文乱码

一个中文是两个字节,字节流read()一次只能读取一个字节,为了得到后面的字,可以定义数组的长度

image.png

在控制台输出不能直接打印,需要使用String方法把byte数组转换成字符串,不然还是直接打印每个字节(乱码)

image.png

整体代码举例

image.png

字节流输出流 FileOutputStream

  • 因为字节流输入流OutpuStream是抽象类,所以需要使用下面的子类FileOutputSteam
  • FileOutputStream 会自动创建一个文件(如果文件不存在,并且文件的路径存在的)

image.png

写数据进文件

构造方法

构造方法描述
FileOutputStream(File file)覆盖
FileOutputStream(String name)覆盖,常用 ,name表示文件的路径名(路径+文件名
FileOutputStream(File file, boolean append追加)append追加

整体代码举例

image.png

文件拷贝

字符流

  • 不适用于复制操作视频、音频等文件,主要用来操作中文文档
  • 构造方法和方法和字节流输入流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

举例

image.png

缓冲流

之前集中循环的读写数据,操作磁盘次数非常多,影响性能,通过缓冲流,可以先缓存大量读写数据,等达到一定数量后,再链接磁盘进行读写操作,达到高效读写效果

字节流缓冲流举例

image.png

字符流缓冲流举例

image.png

打印流

image.png

关流方式

第一种

使用try/catch/finally,在finally里面写关流(先写输出,后写输入,切记不可把两个关流一起try

第二种

使用try(需要关流的代码){}catch{}(不需要finally
举例

image.png

乱码问题

  • 本身字符编码不支持某种语言(比如中文)
  • 字符编码不一致,常见的字符编码较多,我们常用的是UTF-8