首页 > 编程语言 >Java IO

Java IO

时间:2022-12-20 14:35:24浏览次数:64  
标签:字符 Java 字节 接口 IO java 序列化

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 中几种类型的流

按照流的方向:

  1. 输入流(InputStream:从文件读入到内存。只能进行读操作。

  2. 输出流(OuputStream:从内存读出到文件。只能进行写操作。

  3. 注:输出流可以帮助我们创建文件,而输入流不会。

按处理数据单位:

  1. 字节流:以字节为单位,每次次读入或读出是8位数据。可以读任何类型数据,图片、文件、音乐视频等。 (Java代码接收数据只能为byte数组)

  2. 字符流:以字符为单位,每次读入或读出是16位数据。其只能读取字符类型数据。 (Java代码接收数据为一般为char数组,也可以是别的)

字节流如何转为字符流

  1. 字节输入流转字符输入流通过 InputStreamReader 实现,该类的构造函数可以传入 InputStream 对象。

  2. 字节输出流转字符输出流通过 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 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。

如何实现对象克隆?

有两种方式

  1. 实现 Cloneable 接口并重写 Object 类中的 clone()方法;
  2. 实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。

RandomAccessFile类

它在http://java.io包中是一个特殊的类,既不是输入流也不是输出流,它两者都可以做到。通常来说,一个流只有一个功能,要么读,要么写。但是RandomAccessFile既可以读文件,也可以写文件。他实现了DataOutput, DataInput, DataInputStream 和 DataOutStream有的方法,在RandomAccessFile中都存在。

标签:字符,Java,字节,接口,IO,java,序列化
From: https://www.cnblogs.com/microstar/p/16994089.html

相关文章