Java面试复习5 IO和流
声明:本面试复习都基于一本未署名的Java面试宝典所述,根据自己的理解写出了这一专栏的复习博客
-
介绍一下Java中都有哪几种流?
流的分类
按照流向:
- inputStream 输入流:读取外部数据 ,
- outputStream 输出流:写出内部数据
按照实现功能:节点流和处理流。
- 节点流(文件流)(:可以直接从或者向某一个节点(或者说数据源,目的地)读写数据,如FileReader,FileWriter就是对文件的读写。
- 处理流:不直接连接到数据源或目的地,而是“连接” 在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。比较常用的需要知道的比如说缓冲流就属于处理流的一部分(提供一个8Kb的缓冲区)
按照处理数据的单位:字节流8bit和字符流16bit。
- 字节流基于InputStream和outputStream
- 字符流基于Reader和Writer。
可以按照流向更加细化,如字节输入流,字节输出流等等。具体如下:
- Java的IO流共涉及40多个类,实际上非常规则,都是从上述4个抽象基类派生的。
- 由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。
-
字节流如何转为字符流?
字节输入流转字符输入流通过InputStreamReader实现,该类的构造函数可以传入InputStream对象。
字节输出流转字符输出流通过OutputStreamWriter实现,该类的构造函数可以传入OutputStream对象。这里就是所说的转换流。
所谓转换流就是Java API提供的连个转换流,实现字节流和字符流之间的转换
-
如何将一个Java对象序列化到文件中
首先我们需要理解,什么是序列化,要实现序列化,首先要让该类实现serializable接口,这个接口其实是一个空的接口,也就是这个接口中没有任何方法,这个接口的作用主要是标识作用,让JVM知道实现着接口的类需要序列化。
在网上查阅相关博客的时候,我发现了一个比较有趣的说法:这个serializable接口实际上就相当于是一个提示,比如说你现在有个问题没法解决,但是你又不说,就没人知道你的问题,这时候你举手示意某个技术大牛来帮助你,他就来了,而这个“举手”的动作实际上就是一个标识,serializable接口同样的,你要实现序列化,但是JVM不知道你要实现序列化,你想让JVM知道,就得有个标识,serializable接口的作用就是如此。在实现接口后,我们就可以在类中编写代码了,对于对象的写出文件,我们用对象输出流。
-
字节流和字符流的区别
字节流操作字节,比如: .mp3, .avi, .rmvb, mp4, .jpg, .doc, .ppt
字符流操作字符,只能操作普通文本文件。 最常见的文本文件: .txt, .java, .c, .cpp 等语言的源代码。尤其注意 .doc,excel,ppt这些不是文本文件。
-
如何实现对象克隆
第一种方式复习一里有明确叙述,这里主要说第二种方式。
作者解答:
-
什么是Java序列化,如何实现序列化?
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的, 然后 使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象, 接着 ,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
参考博文:https://www.cnblogs.com/yangchunze/p/6728086.html