1. IO流概述
IO流:用来进行设备间的数据传输问题(上传文件和下载文件)
Java对数据的操作是通过流的方式
Java用于操作流的对象都在IO包中
2. IO流分类
按流向分:
- 输入流(读取数据)
- 输出流(写出数据)
按数据类型分:
- 字节流
- 字节输入流——InputStream
- 字节输出流——OutputStream
- 字符流(方便操作文本数据)
- 字符输入流——Reader
- 字符输出流—— Writer
注意:
- 如果没有明确说明,默认按照数据类型分;
- 如果数据所在的文件通过windows自带的记事本打开并能读懂里面的内容,就用字符流
- 其他情况使用字节流
3. IO流常用基类
字节流的抽象基类: InputStream(读取数据),OutputStream(写出数据)
字符流的抽象基类: Reader(读取数据) , Writer(写出数据)
注意:每种基类的子类都是以父类名作为后缀名。
- XxxOutputStream
- XxxInputStream
- XxxReader
- XxxWriter
4. 字节流写数据
OutputStream是抽象类,不能实例化
FileOutputStream是OutputStream的一个具体子类,通过它来实例化
FileOutputStream的构造方法:
- FileOutputStream(File file)——将路径封装成一个file对象
- FileOutputStream(String name)——直接传递路径
FileOutputStream的成员方法:
- public void write(int b)——写一个字节
- public void write(byte[] b) ——写一个字节数组
- public void write(byte[] b,int off,int len)——写一个字节数组的一部分
FileOutputStream写出数据操作步骤:
- 创建字节输出流对象
FileOutputStream fos = new FileOutputStream("fos.txt");
- 调用write()方法
fos.write("hello".getBytes());
- 释放资源
fos.close();
注意:
- 创建字节输出流对象了做了几件事情:
- 调用系统功能创建文件
- 创建对象
- 将对象指向文件
- 数据写成功后,为什么要close()?
- 让流对象变成垃圾,这样就可以被垃圾回收器回收
- 通知系统去释放跟该文件相关的资源
- 如何实现数据的换行?
- 在写入数据的代码中加入换行符即可,不同系统换行符不同
- winodws:\r\n
- linix:\n
- Mac:\r
- 一些常见的高级记事本可以识别任意换行符
- 如何实现数据的追加写入(再次运行继续写入数据)?
- 创建对象时使用构造方法public FileOutputStream(String name,boolean append)带第二个参数为true的情况
5. 字节流读取数据
FileInputStream是InputStream的一个具体子类
FileInputStream的构造方法:
- FileInputStream(File file)
- FileInputStream(String name)
FileInputStream的成员方法 :
- public int read() ——读取下一个字节(一次读取一个字节)
- public int read(byte[] b)——一次读取一个字节数组,每次可以读取多个数据,数组作为缓冲区,提高效率
字节输入流操作步骤:
- 创建字节输入流对象
- 调用read()方法读取数据,并把数据显示在控制台
- 释放资源
字节流复制文本文件步骤:
数据源——读取数据——FileInputStream
目的地——写出数据——FileOutputStream
- 封装数据源
- 封装目的地
- 复制数据
- 释放资源
6. 字节缓冲流
Java提供了带缓冲区的字节类以提高效率,这种类被称为缓冲区类(或高效类)
字节缓冲输出流 ——BufferedOutputStream
BufferedOutputStream构造方法(可以指定缓冲区大小,但是一般默认缓冲区就够用了):
- BufferedOutputStream(OutputStream out)——创建一个新的缓冲输出流,以将数据写入指定的底层输出流
- BufferedOutputStream(OutputStream out,int size)——创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流
这里传递的是OutputStream对象,因为字节缓冲区流仅仅提供缓冲区以提高效率,真正的读写操作还得靠基本的流对象实现
字节缓冲输入流 ——BufferedInputStream
BufferedInputStream构造方法与输出流同理,传递的是InputStream对象
BufferedInputStream读取数据的两种方法
- int read() ——读取下一个字节(一次读取一个)
- int read(byte[] b)——一次读取一个字节数组
7. 字符流
7.1 概述
转换流:字节流操作中文数据不是特别的方便,所以就出现了转换流
转换流的作用:就是把字节流转换字符流来使用
转换流其实是一个字符流
字符流 = 字节流 + 编码表
7.2 编码表概述
编码表:就是由字符和对应的数值组成的一张表
常见的编码表:
- ASCII——一个字节表示,最高位为符号位,其余为数值位
- ISO-8859-1——拉丁码表,8位表示一个数据
- GB2312——简体中文
- GBK——GB2312升级
- GB18030——GBK取代版本
- UTF-8——最多用三个字节表示一个字符
字符串中的编码问题
编码——String编码成byte[]——getBytes()方法
解码——byte[]解码成String——String(数组名)
7.3 字符输出流
OutputStreamWriter 字符输出流构造方法:
- public OutputStreamWriter(OutputStream out) ——根据默认编码将字节流数据转换为字符流数据
- public OutputStreamWriter(OutputStream out,String charsetName) ——根据指定编码将字节流数据转换为字符流数据
OutputStreamWriter 写数据方法:
- public void write(int c) ——写一个字符
- public void write(char[] cbuf) ——写一个字符数组
- public void write(char[] cbuf,int off,int len) ——写一个字符数组的一部分
- public void write(String str) ——写一个字符串
- public void write(String str,int off,int len)——写一个字符串的一部分
flush()的作用
- 刷新缓冲区
close()和flush()的区别
- close()关闭流对象,但是先刷新一次缓冲区。关闭之后,流对象不可以继续再使用了。
- flush()仅仅刷新缓冲区,刷新之后,流对象还可以继续使用。
7.4 字符输入流
InputStreamReader 字符输入流:
- public InputStreamReader(InputStream in) ——用默认编码读取数据
- public InputStreamReader(InputStream in,String charsetName)——用指定编码读取数据
OutputStreamReader 读数据方法:
- public int read() ——一次读取一个字符
- public int read(char[] cbuf)——一次读取一个数组
转换流的简化写法
转换流的名字比较长,而常见的操作都是按照本地默认编码实现的,所以,为了简化书写,转换流提供了对应的子类
- FileWriter
- FileReader
7.5 字符缓冲流
字符流为了高效读写,也提供了对应的字符缓冲流
- BufferedWriter——字符缓冲输出流
- BufferedReader——字符缓冲输入流
字符缓冲流的特殊方法
- BufferedWriter:
- public void newLine()——换行(根据系统来决定)
- BufferedReader:
- public String readLine()——一次读取一行数据
- 包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
8. 其他流
操作基本数据类型的流
能读写基本数据类型的数据
- 数据输入流——DataInputStream
- DataInputStream(InputStream in)
- 数据输出流——DataOutputStream
- DataOutputStream(OutputStream out)
内存操作流
用于处理临时存储信息的,程序结束,数据就从内存中消失
操作字节数组
- ByteArrayInputStream
- ByteArrayOutputStream
操作字符数组
- CharArrayReader
- CharArrayWrite
操作字符串
- StringReader
- StringWriter
打印流
字节打印流——PrintStrem
字符打印流——PrintWriter
特点:
- 只有写数据的,没有读取数据,只操作目的地,不操作数据源
- 可以操作任意类型的数据
- 如果启用了自动刷新,在调用println()方法的时候,能够换行并刷新
- 可以直接操作文本文件
可以直接操作文件的流:看API,如果其构造方法能够同时接收File和String类型的参数,一般都是可以直接操作文件的
FileInputStream、FileOutputStream、FileReader 、FileWriter、PrintStream、PrintWriter