字符流:
(注意:字节流和字符流是不一样的,然后读取的文件也不一样,一个是字节文件、一个是文本文件,请注意区分)
用 字节流 读写 文本文件 可能会出现乱码问题:
因为字节流一次只读一个字节,而不管GBK(一个中文两个字节)、还是UTF-8(一个中文三个字节),都属于多个字节,用字节流每次只能读取其中的一部分,所以出现乱码
基础知识:
1.计算机中存储信息都是用二进制数表示
2.按照某种规则,将字符变成二进制,再存储到计算机中,称之为编码
3.按照同样的规则,将存储在计算机中的二进制数解析显示出来,称之为解码
4.编码和解码的方式必须一致,否则会导致乱码
重点:
windows默认使用的码表为:GBK(一个中文两个字节)
idea和以后工作中默认使用Unicode(万国码)的UTF-8编解码格式(一个中文三个字节)
注意:没有UTF-8码表,UTF-8只是一种编解码格式
gbk在编写时可以大写也可以小写
编码和解码的方法:
String字符串→转→字节(字符集=字符表)
byte[ ] getBytes() | 使用平台默认字符集将该String编码为一系列字节将结果存储到新的字节数组中 |
byte[ ] getBytes(String charsetName) | 使用指定字符集将该String编码为一系列字节将结果存储到新的字节数组中 |
字节→转→String字符串
String(byte[ ] bytes) | 通过使用平台的默认字符集解码指定的字节数组来构造新的String |
String(byte[ ] bytes,String charsetName) | 通过指定的字符集解码指定的字节数组来构造新的String |
小结:
1.想拷贝,一律使用字节流或字节缓冲流
2.想要把 文本文件 中的数据读取到 内存 中,用字符输入流
想要把 内存 中的数据写到 文本文件 中,用字符输出流
3.GBK,一个中文(2个字节)
Unicode,一个中文(3个字节)
在写入的时候 ''\r\n".getBytes();
字符流,会先按字节流一个个字节读取,当读取到负数即-23时,就会判断调用者使用的是什么编码表,UTF-8格式编码是3个字节,所以当读取到负数时,会自动将3个字节看成整体,依据Unicode万国表转成中文(如果调用的是GBK码表,当读取到负数时,将2个字节看成整体,依据GBK码表转成中文)
字符流写数据的5个方法:
void write(int c) | 写一个字符 |
void write(char[ ] cbuf) | 写出一个字符数组 |
void write(char[ ] cbuf , int off , int len) | 写出字符数组的一部分 |
void write(String str) | 写一个字符串(常用) |
void write(String str, int off , int len) | 写一个字符串的一部分 |
File构造的特性和FileWrite的构造特性一样
new String(byte[ ] s,int off ,int len)
注意:
在装字节、字符时候,要注意区分,装字节用byte数组,装字符用char数组
在输出时,单个字节要用char强转
写数据:
flush和close方法:
flush() | 刷新流,还可以继续写数据(运行完之后flush方法后的语句还可以继续写) |
close() | 关闭流,释放资源,但在关闭前会先刷新流一次,一旦关闭,就不能再写数据 |
flush方法:
再没有关闭流的情况下,刷新流的作用是再运行后将数据写到文件中(如果默认没有close、flush方法,在运行后,文件内是不会有内容)
读数据:
当报错时,也要注意导包是否正确
缓存流底层都是默认创建长度为8192的数组(也就是缓冲区)
字符缓存流特有方法:
void newline() | 注意:只有BufferedWriter才能使用 换行符,自动检测系统,跨平台的换行符 |
public String readline() | 注意:只有BufferedReader才能使用 读一整行,以回车换行符为结束,不会打印回车换行符(若没有读到数据,则返回null) |
疑问:
BufferedWriter(Writer o)
父:writer
子:FileWriter ----这个可以直接传参?
String r;
while((r = s. readline() )!= null ){ sout(r)}
不能直接写?
while(s.readlint() != null){sout(s.readline())}?
同个文件,要先read完且方法调用完之后,再write,不然会出事情:
在写输入流和输出流时,切记要注意一件事情,若路径都是一样的,则输出流write,有个特性即如果有同名的文件则清空,如果没有同名文件则创建,因为文件要先读取才能写入,在文件读取的时候,文件被write清空了,后面的方法调用的时候就会报空指针异常