前言: 上一篇博客,主要讲解了IO流中字节流的知识点和一些补充知识,而这篇则主要讲解下IO流中字符流的知识点。
1.字符流
概述: 字符流=字节流+编码表。因为字节流对于汉字之类的处理很不方便,汉字在通过任何的编码存储时,都会占用两个及以上字节,且第一个字节为负数,因此java提供了字符流来更方便的解决此类问题。(字符流只能处理文本文件)。
编码表(了解即可):
Ascall值:
GBKXXX:
Unicode字符表:
注意事项:采用何种规则编码,就要采用对应规则解码,否则会出现乱码。
2.字符流的解码和编码(转换流)
首先我们先了解字符串中的解码和编码:
编码:
- byte[] getBytes();将String转换为字节数组;
- byte[] getBytes(String charsetName);通过指定的字符集将String转换为字节数组;
解码:
- String( byte[] bytes);将指定字节数组转换为String;
- String( byte[] bytes,String charsetName);通过指定的字符集将字节数组转换为String;
字符流中的解码与编码
InputStreamReader是用于将得到的字节以特定的解码形式字符输出出来;OutputStreamWriter主要用于将得到的字符写进计算机中 ,以特定的编码字节形式(其中构造方法参数类型为字节类型InputStream和OutputStream);
3.读与写数据方式
写数据的五种方式:
注意事项:进行写字符时候,是因为其中是通过OutputStreamWriter中字符缓冲区中去,所以需要对进行刷新流,存在于FileOutputStream里进行操作;
读数据的两种方式:
读与写的改进版:
当不需要进行指定的解码或者编码类型时,可以采用它们的子类更为方便。
4.字符缓冲流(首先考虑)
概述: 其中字节流跟字符流差不多道理,作为缓冲区,来提高效率,但实际操作都是通过字符流的Read类和Wirter类进行。
特有方法:
说明:其中第一个方法主要用于面对不同系统是换行,第二个方法只读数据,不包含换行符。
5.刷新流方式
首先每次进行流操作后,需要进行关闭流,释放资源;而刷新流也是必要的,不进行刷新流会导致数据导入不进,出现问题。所以刷新流和关闭流时必要的,希望大家成为一种习惯。
6.总结
7.重要案例
复制多级文件夹
思路: 首先复制多级文件夹则需要知道文件夹中所存在的路径,对于路径可以创建File类来获得其路径名,再通过其路径名复制到该指定的路径中,如果是其文件夹则可以通过File类中的mkdir()方法创建其文件夹,如果是文件则通过缓冲字节流来进行创建加复制。
部分代码展示:
//根据数据源创建字符缓冲输入流对象
BufferedReader br = new BufferedReader(new FileReader("myCharStream\\ConversionStreamDemo.java"));
//根据目的地创建字符缓冲输出流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("myCharStream\\Copy.java"));
//读写数据,复制文件
//一次读写一个字符数据
// int ch;
// while ((ch=br.read())!=-1) {
// bw.write(ch);
// }
//一次读写一个字符数组数据
char[] chs = new char[1024];
int len;
while ((len=br.read(chs))!=-1) {
bw.write(chs,0,len);
}
//释放资源
bw.close();
br.close();
复制文件的异常处理:
推荐使用JDK7的可以处理构造和释放资源时两个异常;JDK9只能处理释放资源时的异常。