day09_IO流
1. 字符集
1.1 常见字符集
1.1.1 ASCII
- ASCII(American Standard Code for Information Interchange): 美国信息交换标准代码,包括了英文、数字与符号
- 标准ASCII使用1个字节存储一个字符,首位是0,总共可表示128个字符
1.1.2 GBK
- GBK是汉字编码字符集,包含了2万多个汉字等字符
- GBK兼容了ASCII字符集
- 汉字占2个字节,英文、数字占1个字节
1.1.3 Unicode
-
Unicode字符集,也叫统一码或万国码
-
Unicode是国际组织制定的,可以容纳世界上所有文字、符号的字符集
-
UTF-32
- 4个字节表示一个字符,可以包含所有字符
- 占用内存空间,通讯效率变低
-
UTF-8
- 采取可变长编码方案,共分四个长度区:1个字节,2个字节,3个字节,4个字节
- 英文字符、数字等只占1个字节(兼容标准ASCII编码),汉字字符占用3个字节
1.2 编码与解码
- 常见编码操作
String提供了如下方法 | 说明 |
---|---|
byte[] getBytes() | 使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中 |
byte[] getBytes(String charsetName) | 使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中 |
- 常见解码操作
String提供了如下方法 | 说明 |
---|---|
String(byte[] bytes) | 通过使用平台的默认字符集解码指定的字节数组来构造新的String |
String(byte[] bytes, String charsetName) | 通过指定的字符集解码指定的字节数组来构造新的String |
注意:
- 字符编码时使用的字符集,和解码时使用的字符集必须一致,否则会出现乱码
- 英文,数字一般不会乱码,因为很多字符集都兼容了ASCII编码
2. IO流
- IO流即输入输出流
- IO流的分类
- 字节输入流(InputStream):以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流
- 字节输出流(OutputStream):以内存为基准,把内存中的数据以字节写出到磁盘文件或者网络中去的流
- 字符输入流(Reader):以内存为基准,来自磁盘文件/网络中的数据以字符的形式读入到内存中去的流
- 字符输出流(Writer):以内存为基准,把内存中的数据以字符写出到磁盘文件或者网络介质中去的流
2.1 字节流
2.1.1 文件字节输出流
- FileOutputStream:以内存为基准,把内存中的数据以字节的形式写出到文件中去
构造方法:
构造器 | 说明 |
---|---|
public FileOutputStream(File file) | 创建字节输出流管道与源文件对象接通 |
public FileOutputStream(String filepath) | 创建字节输出流管道与源文件路径接通 |
public FileOutputStream(File file,boolean append) | 创建字节输出流管道与源文件对象接通,可追加数据 |
public FileOutputStream(String filepath,boolean append) | 创建字节输出流管道与源文件路径接通,可追加数据 |
常用方法:
方法名称 | 说明 |
---|---|
public void write(int a) | 写一个字节出去 |
public void write(byte[] buffer) | 写一个字节数组出去 |
public void write(byte[] buffer , int pos , int len) | 写一个字节数组的一部分出去 |
public void close() throws IOException | 关闭流 |
换行符:
\r\n
2.1.2 文件字节输入流
- FileInputStream:以内存为基准,可以把磁盘文件中的数据以字节的形式读入到内存中去
构造方法:
构造器 | 说明 |
---|---|
public FileInputStream(File file) | 创建字节输入流管道与源文件接通 |
public FileInputStream(String pathname) | 创建字节输入流管道与源文件接通 |
常用方法:
方法名称 | 说明 |
---|---|
public int read() | 每次读取一个字节返回,如果发现没有数据可读会返回-1 |
public int read(byte[] buffer) | 每次用一个字节数组去读取数据,返回字节数组读取了多少个字节,如果发现没有数据可读会返回-1 |
public byte[] readAllBytes() throws IOException | 直接将当前字节输入流对应的文件对象的字节数据装到一个字节数组返回 |
注意:如果文件过大,一次读取时若创建的字节数组过大,可能引起内存溢出
2.2 字符流
2.2.1 文件字符输入流
- FileReader:以内存为基准,可以把文件中的数据以字符的形式读入到内存中去
构造方法:
构造器 | 说明 |
---|---|
public FileReader(File file) | 创建字符输入流管道与源文件接通 |
public FileReader(String pathname) | 创建字符输入流管道与源文件接通 |
常用方法:
方法名称 | 说明 |
---|---|
public int read() | 每次读取一个字符返回,如果发现没有数据可读会返回-1 |
public int read(char[] buffer) | 每次用一个字符数组去读取数据,返回字符数组读取了多少个字符,如果发现没有数据可读会返回-1 |
2.2.2 文件字符输出流
- FileWriter:以内存为基准,把内存中的数据以字符的形式写出到文件中去
构造方法:
构造器 | 说明 |
---|---|
public FileWriter(File file) | 创建字节输出流管道与源文件对象接通 |
public FileWriter(String filepath) | 创建字节输出流管道与源文件路径接通 |
public FileWriter(File file,boolean append) | 创建字节输出流管道与源文件对象接通,可追加数据 |
public FileWriter(String filepath,boolean append) | 创建字节输出流管道与源文件路径接通,可追加数据 |
常用方法:
方法名称 | 说明 |
---|---|
void write(int c) | 写一个字符 |
void write(String str) | 写一个字符串 |
void write(String str, int off, int len) | 写一个字符串的一部分 |
void write(char[] cbuf) | 写入一个字符数组 |
void write(char[] cbuf, int off, int len) | 写入字符数组的一部分 |
public void flush() throws IOException | 刷新流,就是将内存中缓存的数据立即写到文件中去生效 |
public void close() throws IOException | 关闭流的操作,包含了刷新 |
换行符:
\r\n
3. 释放资源的方式
1. try-catch-finally
- finally代码区的特点:无论try中的程序是正常执行了,还是出现了异常,最后都一定会执行finally区,除非JVM终止
- 可以用于在程序执行完成后进行资源的释放操作
2. try-with-resource
-
resource代码区的特点:资源使用完毕后,会自动调用其close()方法,完成对资源的释放
-
()
中只能放置资源,否则报错 -
格式:
try ( 定义资源1; 定义资源2; ...; ) { 可能出现异常的代码; } catch (异常类 变量名) { 异常的处理代码; }