-
- 1、Java 中有几种类型的流?
-
2、字节流如何转为字符流?
-
3、如何将一个 java 对象序列化到文件里?
-
4、字节流和字符流的区别?
-
5、如何实现对象克隆?
-
6、什么是 java 序列化,如何实现 java 序列化?
按照流的方向:输入流(inputStream
)和输出流(outputStream
)
按照实现功能分:
节点流
(可以从或向一个特定的地方(节点)读写数据。如 FileReader)和处理流(是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。
如 BufferedReader。处理流的构造方法总是要带一个其他的流对象做参数。
一个流对象经过其他流的多次包装,称为流的链接。)
按照处理数据的单位: 字节流和字符流。
字节流继承于 InputStream
和 OutputStream
, 字符流继承于InputStreamReader
和OutputStreamWriter
。
字节输入流转字符输入流通过 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 {
}
});
在 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();
}
}
字节流读取的时候,读到一个字节就返回一个字节;
字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在 UTF-8 码表中是 3 个字节)时。
先去查指定的编码表,将查到的字符返回。
字节流可以处理所有类型数据,如:图片,MP3,AVI视频文件,
而字符流只能处理字符数据,只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。
字节流主要是操作 byte 类型数据
,以 byte 数组为准,
主要操作类就是 OutputStream、InputStream字符流处理的单元为 2 个字节的 Unicode 字符,
分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。
所以字符流是由 Java 虚拟机将字节转化为 2 个字节的 Unicode 字符
为单位的字符而成的,
所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,
如果是关系到中文(文本)的,用字符流好点。
在程序中一个字符等于两个字节,java 提供了 Reader、Writer 两个专门操作字符流的类。
有两种方式:
● 实现 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](https://i-blog.csdnimg.cn/blog_migrate/26ac6cccae3acd8cf3aff6e342db2aff.jpeg)
总结
蚂蚁面试比较重视基础,所以Java那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。
经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。
经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。
[外链图片转存中…(img-uW05gtQ1-1713389784295)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!