IO流

Posted Shuu丶_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO流相关的知识,希望对你有一定的参考价值。

绑定IO资源:
获取文件当前的使用权限
FileWriter和FileReader是Io流升级的便捷类,不能代表IO流

数据就是二进制数
同样的二进制数据,被不同软件通过规则翻译成不同形式的数据显示出来,其本质一直都是二进制数字

OutputStream:字节输出流的根类,定义了所有字节输出流应该具备的方法
close()    解绑IO资源(关闭IO流)

我们输入的各种类型的数据,最后都是由虚拟机或者java程序修改过的,其实输入的是二进制数字,然后输出的时候再变回我们的数据,这是为了方便java程序员,简单说就是,数据就是二进制

字符流:以字符为单位操作的操作流

InputStreamReader:将字节流输入转换成字符流输入
OutputStreamWriter:将字节流输出转换成字符流输出

FileInputStream是字节流,InputStreamReader是字节流
为什么要转换:
字节流读取的是一个个字节,如果是中文(两个字节)的话就会将中文拆成两个字节,结果是输不出中文的,而字符流读取的时候是按照编码表来读取的(字符 = 字节 + 编码表),所以能直接读取中文
将字节流(FileInputStream)转换成字符流(InputStreamReader)的方法是将字节流对象传入到字符流的构造方法中
FileInputStream fis = new FileInputStream(路径);
InputStreamReader isr = new InputStreamReader(fis);
或者
InputStreamReader isr = new InputStreamReader(new FileInputStream(路径));


常用编码表:
>ASCII:
>GBK:国标码,中文环境编码常用(2个字节一个汉字)
>GB2112:
>UTF-8:万国码(国际化码表)(3个字节一个汉字)
>ISO8859-1:拉丁码表
>BIG-5:繁体字码表
英文无论什么时候都是ASCII码表

当字节与字符转换的时候用的码表不同的时候就会出现乱码问题
用A码表将字符转换成字节,又用B码表将字符转换成字节,两个码表关系不同就查到了不同的结果

保证不乱码的方式:编码与解码保持相同
中后期,所有的码表都是utf-8

fos  oos
将对象永久性的保存在一个文件中,叫做序列化,读取叫反序列化
步骤:
1.准备被序列化的对象
2.创建序列化流对象
3.序列化对象
4.关闭流
普通类下需要实现序列化接口,开启其序列化功能(Serializable,这个接口没有方法,只是一个标记,用来标记这个类是否需要序列化的)

反序列化:如果是需要使用被序列化的类,那么这个类会自动的生成一个SerialVersonUID,如果类发生了改变而ID没有改变则会报错,如果是自己指定出来了这个UID,则不会报错,如果是指定了UID之后改变了类则不会报错(注意)。

打印流:
PrintStream和PrintWriter
都需要创建一个输出字节流FileOutputStream


Java中的字符串默认使用的是本地编码方式(ANSI)(GBK)


转换编码的方式:
1.将字符串转换成字节数组并调用getBytes(编码格式)然后再把字节转换成字符(字符串)
2.将字节流转换成字符流,字节流转字符流的类OutputStreamWriter(Reader)的构造方法里有设定编码格式的方法

以上是关于IO流的主要内容,如果未能解决你的问题,请参考以下文章

IO流之IO流综述

IO异常--缓冲流--转换流--序列化流( IO流2 )

IO流(序列流)

java中的io流都有哪些

java IO流 IO流概述

IO流