IO流
IO流的分类
- 按流的方向进行分类(以内存为参照)
- 输入流
向内存中输入数据,这个过程叫读 - 输出流
从内存向外输出数据,这个过程叫写
- 按数据读取方式进行分类
- 字节流
一次读取一个字节,八个bit,这种流是万能的,能读取任何类型的文件,包括文本、图片、声音、视频等。。。 - 字符流
一次读取一个字符,这种流是为了方便读取普通文本文件存在的,不能读取图片、声音、视频等文件,只能读取纯文本文件(word类型的都不行,因为word有格式)
Java中四大IO流类
- java.io.InputStream
- java.io.OutputStream
- java.io.Writer
- java.io.Reader
Tips:java中的类,凡是以Stream结尾的都为字节流,凡是以Writer/Reader结尾的都是字符流
所有的流都实现了java.io.Closeable接口中的close()方法,也就是说所有的流都是可关闭了。
所有的输出流都实现了java.io.Flushable接口中的flush()方法,所有的输出流都是可刷新的。
IO流作为内存和硬盘之间数据传输的管道,用完要记得关闭,一直开启会耗费资源。
flush()方法的作用是将在数据传输完成时,将管道中剩余的数据强行输出,清空管道。!防止有数据没有传输完毕留存在管道中,造成数据丢失。
以FileInputStream类作为例子分析流的读取过程
- 首先,创建FileInputStream字节输入流对象
使用FileInputStream(String path)这个构造方法创建对象,参数为文件的路径,可以是绝对路径也可以是相对路径。
(相对路径是从当前路径开始的,IDEA中的当前路径为整个工程的根,project下的目录)
绝对路径:idea会将绝对路径中的‘\’变成‘\\’,因为一个‘\’表示转义,也可以使用'/'作为目录的分隔。
- 其次,调用该类的read()方法读取文件中的字节
- 不带参数的read()一次读一个字节,其返回值为读取到的字节本身,int类型(例如a——>92),当文件读取完时,再read()返回-1。(这种方式效率太低,我们一般不用)
- read(byte[] bytes)这种读取的方式是一次读取byte.lenth长度的字节,其返回值为读取到的字节数。当文件读完时,再调用此方法读返回-1。
我们需要一个byte[]数组,一般来说创建的byte[]数组大小为整个文件的字节数比较好,能一次读取完。可以使用流对象的available(),这个方法返回文件中还未读取的字节数。
以FileOutputStream类作为例子分析流的写入过程
- 首先,创建FileOutputStream字节输出流对象
- FileOutputStream(String path)使用这种构造方法创建的输出流在写入文件时,会将原来文件中的内容清空。
- FileOutputStream(String path,boolean append)使用这种构造方法,如果append传入一个true时,则将输出的内容追加在文件中,不会将其覆盖,append==false,则与上面情况一样。
- 调用writer()方法输出文件。参数与输入流的reader类似。
- 输出字符串,需要使用字符串的getBytes()方法,将字符串转换为字节数组。
其他的流类
- 文件输入输出字符流(使用方法与字节输入输出流类似)
- FileWriter:其writer()方法可以直接写入字符串。
writer("我是中国人!");
- FileReader
- *自带缓冲区的流(自带缓冲区,不需要借助byte[]或char[]了)
- BufferedReader(readLine()方法,直接读一行(原文本中的换行符不读),返回值为String类型)
- BufferedWriter
- BufferedInputStream
- BufferedOutputStream
这种流的构造方法参数为一个流,参数中的流称之为节点流,自身流称为包装流/处理流
在关闭流的时候,只需要关闭包装流即可,节点流已经封装关闭了。
- *转换流
- InputStreamReader:将InputStream转为Reader,字节流转换为字符流
- OutputStreamWriter:将OutputStream转为Writer,字节流转换为字符流
其构造方法参数为一个字节流
- 数据流
- DataInputStream
- DataOutputStream
- 标准输出流
- PrintWriter
- PrintOutStream
System.out返回值类型就是PrintOutStream
- 对象专属流
- ObjectOInputStream
- ObjectOutputStream