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

本文详细介绍了Java中的流类型、字节流与字符流的区别与转换,以及如何将对象序列化到文件和实现对象克隆的方法。特别关注了实现Serializable接口和使用ObjectOutputStream/InputStream进行序列化和反序列化的过程。
摘要由CSDN通过智能技术生成
    • 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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

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

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

蚂蚁面试比较重视基础,所以Java那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。


经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

蚂蚁金服5面,总结了49个面试题,遇到的面试官都是P7级别以上

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。


经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

[外链图片转存中…(img-uW05gtQ1-1713389784295)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 29
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值