IO流(File是创建文件或文件夹,IO流是用来写内容或读取内容):字符流,字符缓冲流

字符流:

(注意:字节流和字符流是不一样的,然后读取的文件也不一样,一个是字节文件、一个是文本文件,请注意区分)

用 字节流 读写 文本文件 可能会出现乱码问题:

因为字节流一次只读一个字节,而不管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清空了,后面的方法调用的时候就会报空指针异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值