Java IO
原理:
作者:哟哟的小豆豆
链接:https://juejin.cn/post/6844903839439519758
来源:稀土掘金
类结构及继承关系图
常见面试题
什么是流?
字符串分解 ------------------->OutStream------------------------>write()方法写到文件中
字节流和字符流的区别?
字节(Byte)是计量单位,表示数据量多少,是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八位。字符(Character)计算机中使用的字母、数字、字和符号,比如'A'、'B'、'$'、'&'等。一般在英文状态下一个字母或字符占用一个字节,一个汉字用两个字节表示。
字节与字符:
- ASCII 码中,一个英文字母(不分大小写)为一个字节,一个中文汉字为两个字节。
- UTF-8 编码中,一个英文字为一个字节,一个中文为三个字节。
- Unicode 编码中,一个英文为一个字节,一个中文为两个字节。
- 符号:英文标点为一个字节,中文标点为两个字节。例如:英文句号 . 占1个字节的大小,中文句号 。占2个字节的大小。
- UTF-16 编码中,一个英文字母字符或一个汉字字符存储都需要 2 个字节(Unicode 扩展区的一些汉字存储需要 4 个字节)。
- UTF-32 编码中,世界上任何字符的存储都需要 4 个字节。
字节流可以处理所有类型数据,如:图片,MP3,AVI视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。
Java 中几种类型的流
按照流的方向:
-
输入流(InputStream):从文件读入到内存。只能进行读操作。
-
输出流(OuputStream):从内存读出到文件。只能进行写操作。
-
注:输出流可以帮助我们创建文件,而输入流不会。
按处理数据单位:
-
字节流:以字节为单位,每次次读入或读出是8位数据。可以读任何类型数据,图片、文件、音乐视频等。 (Java代码接收数据只能为byte数组)
-
字符流:以字符为单位,每次读入或读出是16位数据。其只能读取字符类型数据。 (Java代码接收数据为一般为char数组,也可以是别的)
字节流如何转为字符流
-
字节输入流转字符输入流通过 InputStreamReader 实现,该类的构造函数可以传入 InputStream 对象。
-
字节输出流转字符输出流通过 OutputStreamWriter 实现,该类的构造函数可以传入 OutputStream 对象。
如何将一个 java 对象序列化到文件里?
在 java 中能够被序列化的类必须先实现 Serializable 接口,该接口没有任何抽象方法只是起到一个标记作用。
import java.io.*;
import java.nio.file.Files;
public class Test {
public static void main(String[] args) throws Exception {
//对象输出流
ObjectOutputStream objectOutputStream =
new ObjectOutputStream(Files.newOutputStream(new File("D://obj").toPath()));
objectOutputStream.writeObject(new CreateUser("zhangsan", 100));
objectOutputStream.close();
//对象输入流
ObjectInputStream objectInputStream = new ObjectInputStream(Files.newInputStream(new File("D://obj").toPath()));
CreateUser user = (CreateUser) objectInputStream.readObject();
System.out.println(user);
objectInputStream.close();
}
}
什么是Filter流?
Filter Stream是一种IO流主要作用是用来对存在的流增加一些额外的功能,像给目标文件增加源文件中不存在的行数,或者增加拷贝的性能。
解释一下java.io.Serializable接口?
类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。
如何实现对象克隆?
有两种方式
- 实现 Cloneable 接口并重写 Object 类中的 clone()方法;
- 实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。
RandomAccessFile类
它在http://java.io包中是一个特殊的类,既不是输入流也不是输出流,它两者都可以做到。通常来说,一个流只有一个功能,要么读,要么写。但是RandomAccessFile既可以读文件,也可以写文件。他实现了DataOutput, DataInput, DataInputStream 和 DataOutStream有的方法,在RandomAccessFile中都存在。
标签:字符,Java,字节,接口,IO,java,序列化 From: https://www.cnblogs.com/microstar/p/16994089.html