JAVA备忘录(一):IO流 (面试题)

1.java中有几种类型的流?

A:一般来说有两种区分法

  • 按字节流和字符流分成两种:字节流是基于二进制数据操作的,都继承于InputStream或者OutputStream这两个抽象类。而字符流是基于字符操作的,一般用来解决非英文数据的乱码问题,字符流类都继承于Reader和Reader这两个类。
  • 按照输入输出流也可分成两种:输入流是指从内存或者数据通道上读取数据,比如说FileInputStream和FileReader;而输出流是指向内存或者数据通道中写入数据,比如说FileOutputStream和FileWriter。

2.字节流和字符流的区别

A:字节流是最基本的,计算机的所有数据都采用二进制数据的方法进行传输,而字节流进行操作的最基本单位就是单个字节,所以字节流通常被用来处理对二进制数据。Java中最基本的两个字节流类就是InputStream和OutputStream,所以继承它们的子类都是基于字节流操作的。
而字符流进行操作的最基本单位是Unicode码元(大小为两个字节),字符流经常被用来处理文本数据。Java中最基本的两个字符流父类就是Reader和Writer。所有继承它们两个的子类都是基于字符流操作的。

3.缓冲流与非缓冲流的区别。

A:缓冲流的底层实现了一个缓冲区,其实就是一个长度为8192的byte类型数组,这样可以解决非缓冲流一次只能读取一个字符或者字节导致的低效率问题。另外使用缓冲流还需要注意的是,缓冲区中的数据不会像非缓冲流一样被自动提交,只有当流资源被close(),或者显式地调用flush(),缓冲区中的数据才会被写到目标资源中。
另外如果读写数据非常大的话,也应该使用缓冲流提高效率,还可以降低对硬盘的损伤。

4.什么叫对象序列化,什么叫反序列化,如何实现?

A:序列化就是将对象以二级制数据的形式保存在硬盘中。反序列化就是将二进制文件读取之后转化为对象。
实现方法是让需要进行序列化的类实现Serializable接口,如果不希望类中的某个属性参与序列化,就用transient关键字来修饰该属性。

5.在实现序列化接口的时候一定要生成一个serialVersionUID字段吗?有什么用?

A:不一定。
serialVersionUID是版本号,为了保持版本号的一致来进行序列化。如果没有显式声明该字段的话,JVM会给该类分配一个默认的版本号,每次类中的属性被修改的时候,该版本号都会被修改。而将二进制数据文件进行反序列化并用该类对象去进行接收的时候,如果双方版本号不一致,那么就会报错。而我们显式地声明版本号,就不会出现这个问题。
再配合使用ObjectInputStream和ObjectOutputStream对对象进行转化后的读写就可以完成序列化与反序列化

6.BufferedReader是属于哪种流,有啥用?里面有啥经典的方法?

A:BufferedReader被缓冲流修饰的字符输入流。
首先它是一个输入流,所以能把数据从内存或者数据通道中读取出来;然后它是一个字符流,它的最小处理单位是一个unicode单元,所以经常被用在处理文本数据的场景下;最后它是一个缓冲流,底层实现了缓冲区,把数据写在缓冲区,可以减少客户端和内存的交互次数,提高性能。另外还需要提的是需要手动调用其flush()方法才可以将缓冲区中的数据输出。
经典方法就是readLine()方法,一次可以读取文件中的一行数据,返回一个String类型的对象。

你可能感兴趣的:(JAVA备忘录(一):IO流 (面试题))