IO流

IO流
2. 字符流和字节流有什么区别 ?字符流和字节流有什么区别 ?
① InputStream和Reader都可以用来读数据(从文件中读取数据或从Socket中读取数据),它们的区别是:InputStream用来读取二进制数据 ; Reader用来读取文本数据,即Unicode字符.
② 二进制数据和文本数据的区别:从本质上来讲,所有读取的内容都是字节,要想把字节转换为文本,需要指定一个编码方法.而Reader就可以把字节流进行编码从而转换为文本. 它默认采用系统默认的编码方式对字节流进行编码,也可以显示的指定一个编码方式.
③ FileInputStream和FileReader有着类似的区别,都用与从文件中读取数据,但是FileInputStream用于从文件中读取二进制数据;FileReader用于从文件中读取字符数据.FileReader继承自InputStreamReader,它要么使用系统默认编码的方式,要么使用InputStreamReader所使用的编码方式.注意:InputStreamReader缓存了字符编码,因此在创建InputStreamReader对象以后,如果再对字符编码进行修改将没有任何作用.
3. 什么是java序列化,如何实现java序列化?
先做名词解释,然后阐述作用和使用方法
序列化:把堆内存中的java对象数据,通过某种方式把对象存储到磁盘文件中或者传递给其他网络的节点(在网络上传输)。我们把这个过程称为序列化。
反序列化:把磁盘文件中的对象数据或者把网络节点上的对象数据,恢复成java对象的过程。
为什么要做序列化 – ①在分布式系统汇总,需要共享的数据的javaBean对象,都得做序列化,因为对象需要在网络上进行传输,此时就得把对象数据转换为二进制形式。②服务钝化:如果服务发现某些对象好久都没有活动了,此时服务器就会把这些内存中的对象,持久化在本地磁盘文件中(java对象 --> 二进制文件)。如果某些对象需要活动的时候,先在内存中去寻找,找到就使用,找不到再去磁盘文件中,反序列化我们得到的对象数据,恢复成java对象
实现序列化的方法:需要做序列化的对象的类,必须实现序列化接口:java.io.Serializable接口,该接口没有抽象方法,只是一个标记.
使用static/transient修饰的字段不会被序列化(静态的字段和瞬态的字段)
序列化的版本号问题: 在类中添加固定的serialVersionUID,可以解决反序列化时由于版本不兼容而失败的问题.
序列化的特点:
a. 如果一个类能被序列化,那么他的子类也能被序列化
b. 由于static代表类的成员,transient(如果用transient声明一个实例变量,当对象存储时,他的值不需要维持)代表对象的临时数据,因此被声明为这两种类型的数据成员是不能够被序列化的.
c. 子类实现类Serializable接口,父类没有,父类中的属性不能序列化,但是子类中的属性仍能正确序列化.
4. bit是最小的传输单位;byte是最小的存储单位. 1byte = 8bit
1 char = 2byte
5. BufferedReader是字符流,也是一种包装流,用来增强reader流.主要用来读取数据.
6. 如果要对字节流进行大量的从硬盘读取,要用哪个流,为什么?
用BufferedInputStream — BufferedInputStream是InputStream的缓冲流,使用它可以防止每次读取数据时进行实际的写操作,代表着使用缓冲区.不带缓冲的操作,每次读一个字节就要写入一个字节,由于涉及磁盘的IO操作相比内存的操作要慢很多,所以不带缓冲的流的效率很低.带缓冲的流,可以一次读很多字节,但不向磁盘中写入,只是先放到内存里.等凑够了缓冲区大小的时候一次性写入磁盘,这种方式可以减少磁盘操作次数,速度就会提高很多.并且也可以减少对磁盘的损伤
7. 打印出不同类型的数据到数据源,最适合用哪个流?
printStream — 因为只有字节流才能读写各种类型的数据
8. 怎样把输出字节流转化成输出字符流,说出它的步骤?
利用转换流OutputStreamWriter — 创建一个字节流对象将其作为参数传入转化流OutputStreamWriter中,得到字符流对象.