Java IO面试题【Java面试题】(1)

    • 1、Java 中有几种类型的流?
  • 2、字节流如何转为字符流?

  • 3、如何将一个 java 对象序列化到文件里?

  • 4、字节流和字符流的区别?

  • 5、如何实现对象克隆?

  • 6、什么是 java 序列化,如何实现 java 序列化?

1、Java 中有几种类型的流?


按照流的方向:输入流(inputStream)和输出流(outputStream

按照实现功能分:

节点流

(可以从或向一个特定的地方(节点)读写数据。如 FileReader)和处理流(是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。

如 BufferedReader。处理流的构造方法总是要带一个其他的流对象做参数。

一个流对象经过其他流的多次包装,称为流的链接。)

按照处理数据的单位: 字节流和字符流。

字节流继承于 InputStreamOutputStream, 字符流继承于InputStreamReaderOutputStreamWriter

在这里插入图片描述

2、字节流如何转为字符流?


字节输入流转字符输入流通过 InputStreamReader 实现,

该类的构造函数可以传入 InputStream 对象。

new InputStreamReader(new InputStream() {

public int read() throws IOException {

return 0;

}

});

字节输出流转字符输出流通过 OutputStreamWriter 实现,

该类的构造函数可以传入 OutputStream 对象。

new OutputStreamWriter(new OutputStream() {

public void write(int b) throws IOException {

}

});

3、如何将一个 java 对象序列化到文件里?


在 java 中能够被序列化的类必须先实现 Serializable 接口,

该接口没有任何抽象方法只是起到一个标记作用。

public class Test {

public static void main(String[] args) throws Exception {

//对象输出流

ObjectOutputStream objectOutputStream =

new ObjectOutputStream(new FileOutputStream(new File(“D://obj”)));

objectOutputStream.writeObject(new User(“zhangsan”, 100));

objectOutputStream.close();

//对象输入流

ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(new File(“D://obj”)));

User user = (User) objectInputStream.readObject();

System.out.println(user);

objectInputStream.close();

}

}

4、字节流和字符流的区别?


字节流读取的时候,读到一个字节就返回一个字节;

字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在 UTF-8 码表中是 3 个字节)时。

先去查指定的编码表,将查到的字符返回。

字节流可以处理所有类型数据,如:图片,MP3,AVI视频文件,

而字符流只能处理字符数据,只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。

字节流主要是操作 byte 类型数据,以 byte 数组为准,

主要操作类就是 OutputStream、InputStream字符流处理的单元为 2 个字节的 Unicode 字符,

分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。

所以字符流是由 Java 虚拟机将字节转化为 2 个字节的 Unicode 字符为单位的字符而成的,

所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,

如果是关系到中文(文本)的,用字符流好点。

在程序中一个字符等于两个字节,java 提供了 Reader、Writer 两个专门操作字符流的类。

5、如何实现对象克隆?


有两种方式:

● 实现 Cloneable 接口并重写 Object 类中的 clone()方法;

● 实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆,代码如下:

class MyUtil {

private MyUtil() {

throw new AssertionError();

}

public static T clone(T obj) throws Exception {

ByteArrayOutputStream bout = new ByteArrayOutputStream();

ObjectOutputStream oos = new ObjectOutputStream(bout);

oos.writeObject(obj);

ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());

ObjectInputStream ois = new ObjectInputStream(bin);

return (T) ois.readObject();

// 说明:调用 ByteArrayInputStream 或 ByteArrayOutputStream 对象的 close 方法没有任何意义

// 这两个基于内存的流只要垃圾回收器清理对象就能够释放资源,这不同于对外部资源(如文件流)的释放

}

}

测试代码:

import java.io.Serializable;

/**

  • 人类

*/

class Person implements Serializable {

private static final long serialVersionUID = -91020170202878978L;

private String name; // 姓名

private int age; // 年龄

private Car car; // 座驾

public Person(String name, int age, Car car) {

this.name = name;

this.age = age;

this.car = car;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public Car getCar() {

return car;

}

public void setCar(Car car) {

this.car = car;

}

@Override

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
…(img-LeYOUAXl-1715699896367)]

[外链图片转存中…(img-B2n6KaVz-1715699896367)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 10
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值