Java教程

javaSE 笔记 字符流 + 字符缓冲流 + IO流小结

本文主要是介绍javaSE 笔记 字符流 + 字符缓冲流 + IO流小结,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

为什么会输出字符流

由于字节流操作中文不是特别的方便,所以java就提供字符流
字符流 = 字节流 + 编码表
用字节流复制文本文件时,文本文件也会有中文,但是没问题,因为最终底层操作会自动进行字节拼接成中文,如何识别是中文的呢?
汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数。

编码表

计算机要准确的存储和识别各种字符集符号,就需要进行字符编码,一套字符集必然至少有一套字符编码。常见的字符集有ASCII字符集,GCXXX字符集
,Unicode字符集
GBK是比较重要的支持中文编码的字符集,Unicode被称为万国码,有三种编码方案,分别是UTF-8,UTF-16,UTF-32,最常用的是UTF-8,
它使用一至四个字节为每个字符编码。

字符串中的编码解码问题

String s = "中国";
bytes[] bys = s.getBytes("UTF-8"); // [-28,-72,-83,-27,-101,-67]
String ss = new String(bys,"UTF-8");
System.out.println(ss);

bytes[] bys = s.getBytes("GBK");  // [-42,-48,-71,-6]
String ss = new String(bys,"GBK");
System.out.println(ss);

使用何种字符集进行编码,就必须使用何种字符集进行解码

字符流中的编码解码问题

字符流抽象基类:Reader:字符输入流的抽象类 Writer:字符输出流的抽象类
字符流中编码解码问题相关的两个类:InputStreamReader,OutputStreamWriter
InputStreamReader(InputStream isr)是从字节流到字符流的桥梁,它读取字节,并使用指定的字符集将其解码为字符
InputStreamReader isr = new InputStreamReader(new FileInputStream("D://qqq.txt","UTF-8"))

OutputStreamWriter(OutputStream osw)是从字符流到字节流的桥梁,它使用指定的字符集将写入的字符编码为字节
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D://qqq.txt"),"UTF-8")

跟上面的字符串编解码问题比较,一个是在由字符数组转成字符串的时候,必须指明特定的字符集进行解码,而这边是在字节流对象转成字符流对象的时候,指明特定的字符集进行解码。

字符流写数据的5种方式

1.写一个字符,一个字符数组,一个字符数组的一部分,一个字符串,一个字符串的一部分
注意字符流写数据是没法直接写进去的,因为真正写进去还是得靠字节流,这时还在缓冲区,需要调用一次osw.flush() //刷新流,
然后注意释放资源osw.close()这个方法是先刷新后关闭的

字符流读数据的2种方式

1.//int read()一次读取一个字节

int ch;
while ((ch=isr.read())!=-1){
    System.out.print((char)ch)
}

2.//int read(char[] cbuf),一次读取一个字符数组数据

char[] chs = new char[1024];
int len;
while((len=isr.read())!=-1){
    System.out.print(new String(chs,0,len)); //这边调用的是String的参数为字符数组的构造方法,前面还有参数为字节数组的构造方法
}

复制java文件改进版

因为InputStreamReader和OutputStreamWriter写起来实在太麻烦了,所以我们直接使用它的子类,FileReader和FileWriter,分别
是读取字符文件的便捷类以及写入字符文件的便捷类。但是想做字符流中的编码问题,还得使用转换流,InputStreamReader和OutputStreamWriter。
整个读写过程是这样的:一个文件要读,然后想到Reader基类,再想到字符输入流对象InputStreamReader,但是写起来太麻烦,就想使用
简单的读取字符文件的子类,FileReader。写数据的话整个心路历程也是这样的。

然后注意FileReader和FileWriter既然是转换流的子类,那么他们同样是跟转换流一样有多种读取和写入的方法的。

字符缓冲流

BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小
,默认值足够大, 可用于大多数用途。
BufferedReader:从字符输入流读取文本,缓冲字符,其他差不多
具体操作跟字节缓冲流也没什么不同的。

字符缓冲流特有功能

BufferedWriter:
void newLine():写一行 行分隔符,行分隔符由系统属性定义

BufferedReader:
public String readLine():读一行文字。结果包含行的内容的字符串,不包括任何行终止字符。如果流的结尾已经到达,则为Null。

IO流小结:
字节流:

因为InputStream和OutputStream是抽象类,所以我们选择使用他们的子类。

字符流:

这篇关于javaSE 笔记 字符流 + 字符缓冲流 + IO流小结的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!