开篇介绍
大家好,我是 Java 面试题库的提裤姐,明天这篇是 JavaSE 系列的第十四篇,次要总结了 Java 中的 IO 流的问题,IO 流分为两篇来讲,这篇是第一篇,次要是根本 IO 流,第二篇次要为网络 IO 流,在后续,会沿着第一篇开篇的常识线路始终总结上来,做到日更!如果我能做到百日百更,心愿你也能够跟着百日百刷,一百天养成一个好习惯。
什么是 io 流
它是一种数据的流从源头流到目的地。比方文件拷贝,输出流和输入流都包含了。输出流从文件中读取数据存储到过程 (process) 中,输入流从过程中读取数据而后写入到指标文件。
Java 中有几种类型的流?
依照流的方向:
- 输出流(
inputStream
) - 输入流(
outputStream
)。
依照实现性能分:
-
节点流
(能够从或向一个特定的中央(节点)读写数据。如 FileReader) -
解决流
(是对一个已存在的流的连贯和封装,通过所封装的流的性能调用实现数据读写。如 BufferedReader。解决流的构造方法总是要带一个其余的流对象做参数。一个流对象通过其余流的屡次包装,称为流的链接。)
依照解决数据的单位:字节流和字符流。字节流继承于 InputStream 和 OutputStream,字符流继承于
InputStreamReader 和 OutputStreamWriter。
字节流如何转换为字符流
字节输出流转字符输出流通过 InputStreamReader
实现,该类的构造函数能够传入 InputStream
对象。
字节输入流转字符输入流通过 OutputStreamWriter
实现,该类的构造函数能够传入 OutputStream
对象。
如何将一个 java 对象序列化到文件里?
在 java 中可能被序列化的类必须先实现 Serializable
接口,该接口没有任何形象办法只是起到一个标记作用。
什么是 java 序列化,如何实现 java 序列化?
序列化
是一种用来解决对象流的机制,所谓对象流也就是将对象的内容进行流化。能够对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:将须要被序列化的类实现 Serializable
接口,该接口没有须要 实现的办法,implements Serializable 只是为了标注该对象是可被序列化的,而后应用一个输入流 (如:FileOutputStream) 来结构
一个 ObjectOutputStream(对象流)对象,接着,应用 ObjectOutputStream 对象的 writeObject(Object obj)办法就能够将参数为 obj 的对象写出(即保留其状态),要复原的话则用输出流。
如何实现对象克隆?
两种形式:
- 实现 Cloneable 接口并重写 Object 类中的 clone()办法;
- 实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,能够实现真正的深度克隆。
留神:基于序列化和反序列化实现的克隆不仅仅是深度克隆,更重要的是通过泛型限定,能够查看出要克隆的对象是否反对序列化,这项查看是编译器实现的,不是在运行时抛出异样,这种是计划显著优于应用 Object 类的
clone
办法克隆对象。让问题在编译的时候裸露进去总是好过把问题留到运行时。
字节流和字符流的区别
字节流在 JDK1.0 中就被引进了,用于操作蕴含 ASCII 字符的文件。JAVA 也反对其余的字符如 Unicode,为了读取蕴含 Unicode 字符的文件,JAVA 语言设计者在 JDK1.1 中引入了字符流。ASCII 作为 Unicode 的子集,对于英语字符的文件,能够能够应用字节流也能够应用字符流。
字节流有了为啥还要有字符流
字符流是由 Java 虚拟机将字节转换失去的,问题就出在这个过程还算是十分耗时,并且,如果咱们不晓得编码类型就很容易呈现乱码问题。所以,I/O 流就罗唆提供了一个间接操作字符的接口,不便咱们平时对字符进行流操作。如果音频文件、图片等媒体文件用字节流比拟好,如果波及到字符的话应用字符流比拟好。
FileInputStream 和 FileOutputStream 是什么?
这是在拷贝文件操作的时候,常常用到的两个类。在解决小文件的时候,它们性能体现还不错,在大文件的时候,最好应用 BufferedInputStream (或 BufferedReader) 和 BufferedOutputStream (或 BufferedWriter)
Files 的罕用办法都有哪些?
- Files. size():查看文件个数。
- Files. read():读取文件。
- Files. write():写入文件。
- Files. exists():检测文件门路是否存在。
- Files. createFile():创立文件。
- Files. createDirectory():创立文件夹。
- Files. delete():删除一个文件或目录。
- Files. copy():复制文件。
- Files. move():挪动文件。