(1)把多个输入流的数据写到一个输出流中。
(2)构造方法:
A:SequenceInputStream(InputStream s1, InputStream s2)
B:SequenceInputStream(Enumeration<? extends InputStream> e)
合并复制1:
/*复制:
-
以前的操作:
-
a.txt – b.txt
-
c.txt – d.txt
-
现在想要:
-
a.txt+b.txt – ab.txt
*/
public class SequenceInputStreamDemo {
public static void main(String[] args) throws IOException {
FileInputStream f1 = new FileInputStream(“a.txt”);
FileInputStream f2 = new FileInputStream(“b.txt”);
SequenceInputStream sis = new SequenceInputStream(f1,f2);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(“ab.txt”));
byte[] bytes = new byte[1024];
int len = 0 ;
while ((len = sis.read(bytes)) != -1) {
bos.write(bytes,0,len);
}
bos.close();
sis.close();
}
}
合并复制2:
/*
-
以前的操作:
-
a.txt – b.txt
-
c.txt – d.txt
-
e.txt – f.txt
-
现在想要:
-
a.txt+b.txt+c.txt – abc.txt
*/
public class SequenceInputStreamDemo2 {
public static void main(String[] args) throws IOException {
Vector v = new Vector<>();
InputStream s1 = new FileInputStream(“a.txt”);
InputStream s2 = new FileInputStream(“b.txt”);
InputStream s3 = new FileInputStream(“c.txt”);
v.add(s1);
v.add(s2);
v.add(s3);
Enumeration en = v.elements();
SequenceInputStream sis = new SequenceInputStream(en);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(“abc.txt”));
byte[] bytes = new byte[1024];
int len = 0 ;
while ((len = sis.read(bytes)) != -1) {
bos.write(bytes,0,len);
}
bos.close();
sis.close();
}
}
7:序列化流(理解)
(1)可以把对象写入文本文件或者在网络中传输
(2)如何实现序列化呢?
让被序列化的对象所属类实现序列化接口。
该接口是一个标记接口。没有功能需要实现。
(3)注意问题:
把数据写到文件后,在去修改类会产生一个问题。
如何解决该问题呢?
在类文件中,给出一个固定的序列化id值。
而且,这样也可以解决黄色警告线问题
(4)面试题:
什么时候序列化?
如何实现序列化?
什么是反序列化?
代码示例:
Person.java
/*
-
NotSerializableException:未序列化异常
-
类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。
-
该接口居然没有任何方法,类似于这种没有方法的接口被称为标记接口。
-
java.io.InvalidClassException:
-
cn.itcast_07.Person; local class incompatible:
-
stream classdesc serialVersionUID = -2071565876962058344,
-
local class serialVersionUID = -8345153069362641443
-
为什么会有问题呢?
-
Person类实现了序列化接口,那么它本身也应该有一个标记值。
-
这个标记值假设是100。
-
开始的时候:
-
Person.class -- id=100
-
wirte数据: oos.txt -- id=100
-
read数据: oos.txt -- id=100
-
现在:
-
Person.class -- id=200
-
wirte数据: oos.txt -- id=100
-
read数据: oos.txt -- id=100
-
我们要知道的是:
-
看到类实现了序列化接口的时候,要想解决黄色警告线问题,就可以自动产生一个序列化id值。
-
而且产生这个值以后,我们对类进行任何改动,它读取以前的数据是没有问题的。
-
注意:
-
我一个类中可能有很多的成员变量,有些我不想进行序列化。请问该怎么办呢?
-
使用transient关键字声明不需要序列化的成员变量
*/
public class Person implements Serializable {
private static final long serialVersionUID = 5816344743154801933L;
private String name;
// private int age;
private transient int age;
// int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
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;
}
@Override
public String toString() {
return “Person [name=” + name + “, age=” + age + “]”;
}
}
ObjectStreamDemo.java
/*
-
序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输。对象 – 流数据(ObjectOutputStream)
-
反序列化流:把文本文件中的流对象数据或者网络中的流对象数据还原成对象。流数据 – 对象(ObjectInputStream)
*/
public class ObjectStreamDemo {
public static void main(String[] args) throws IOException,
ClassNotFoundException {
// 由于我们要对对象进行序列化,所以我们先自定义一个类
// 序列化数据其实就是把对象写到文本文件
// write();
read();
}
private static void read() throws IOException, ClassNotFoundException {
// 创建反序列化对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
“oos.txt”));
// 还原对象
Object obj = ois.readObject();
// 释放资源
ois.close();
// 输出对象
System.out.println(obj);
}
private static void write() throws IOException {
// 创建序列化流对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(
“oos.txt”));
// 创建对象
Person p = new Person(“林青霞”, 27);
// public final void writeObject(Object obj)
oos.writeObject§;
// 释放资源
oos.close();
}
}
8:Properties(理解)
(1)是一个集合类,Hashtable的子类
(2)特有功能
A:public Object setProperty(String key,String value)
B:public String getProperty(String key)
C:public Set stringPropertyNames()
(3)和IO流结合的方法
把键值对形式的文本文件内容加载到集合中
public void load(Reader reader)
public void load(InputStream inStream)
把集合中的数据存储到文本文件中
public void store(Writer writer,String comments)
public void store(OutputStream out,String comments)
(4)案例:
写一个程序实现控制猜数字小游戏程序不能玩超过5次(用Properties控制玩的次数)
Properties当做map来用:
Properties prop = new Properties();
// 添加元素
prop.put(“it002”, “hello”);
prop.put(“it001”, “world”);
prop.put(“it003”, “java”);
// 遍历集合
Set set = prop.keySet();
for (Object key : set) {
Object value = prop.get(key);
System.out.println(key + “—” + value);
}
properties的特殊功能:
// 创建集合对象
Properties prop = new Properties();
// 添加元素
prop.setProperty(“张三”, “30”);
prop.setProperty(“李四”, “40”);
prop.setProperty(“王五”, “50”);
// public Set stringPropertyNames():获取所有的键的集合
Set set = prop.stringPropertyNames();
for (String key : set) {
String value = prop.getProperty(key);
System.out.println(key + “—” + value);
}
properties和io流的联合:
private static void myStore() throws IOException {
// 创建集合对象
Properties prop = new Properties();
prop.setProperty(“林青霞”, “27”);
prop.setProperty(“武鑫”, “30”);
prop.setProperty(“刘晓曲”, “18”);
//public void store(Writer writer,String comments):把集合中的数据存储到文件
Writer w = new FileWriter(“name1.properties”);
prop.store(w, null);//第二个参数是列表的描述
w.close();
}
private static void myLoad() throws IOException {
Properties prop = new Properties();
// public void load(Reader reader):把文件中的数据读取到集合中
// 注意:这个文件的数据必须是键值对形式
Reader r = new FileReader(“name1.properties”);
prop.load®;
r.close();
System.out.println(“prop:” + prop);
}
案例猜数字游戏:
游戏源码:
public class GuessNumber {
private GuessNumber() {
}
public static void start() {
// 产生一个随机数
int number = (int) (Math.random() * 100) + 1;
// 定义一个统计变量
int count = 0;
while (true) {
// 键盘录入一个数据
Scanner sc = new Scanner(System.in);
System.out.println(“请输入数据(1-100):”);
int guessNumber = sc.nextInt();
count++;
// 判断
if (guessNumber > number) {
System.out.println(“你猜的数据” + guessNumber + “大了”);
} else if (guessNumber < number) {
System.out.println(“你猜的数据” + guessNumber + “小了”);
} else {
System.out.println(“恭喜你,” + count + “次就猜中了”);
break;
}
}
}
}
用properties将游戏次数记录在文本中:
public class PropertiesTest2 {
public static void main(String[] args) throws IOException {
Reader reader =new FileReader(“count.properties”);
Properties pro = new Properties();
pro.load(reader);
reader.close();
String count =pro.getProperty(“count”);
int num =Integer.parseInt(count);
if (num>=3){
System.out.println(“您已经免费玩过三次了,再玩请付费!”);
}
else {
num++;
pro.setProperty(“count”,String.valueOf(num));
Writer writer = new FileWriter(“count.properties”);
pro.store(writer,null);
writer.close();
GuessNumber.start();
}
}
}
一般的单机版游戏,都会有.properties文件来记录本地游戏状态。当然实际情况中这个文件是加密的。在后面的框架学习中,我们有时候会数据库的配置放到.properties文件中并且加密。
9:NIO(了解)
(1)JDK4出现的NIO,对以前的IO操作进行了优化,提供了效率。但是大部分我们看到的还是以前的IO
(2)JDK7的NIO的使用
Path:路径
Paths:通过静态方法返回一个路径
Files:提供了常见的功能
复制文本文件
把集合中的数据写到文本文件
代码示例:新型复制:
/*
-
nio包在JDK4出现,提供了IO流的操作效率。
-
JDK7的之后的nio:
-
Path:路径
-
Paths:有一个静态方法返回一个路径
-
public static Path get(URI uri)
-
Files:提供了静态方法供我们使用
-
public static long copy(Path source,OutputStream out):复制文件
-
public static Path write(Path path,Iterable<? extends CharSequence> lines,Charset cs,OpenOption... options)
*/
public class NIODemo {
public static void main(String[] args) throws IOException {
//复制
//Files.copy(Paths.get(“a.txt”),new FileOutputStream(“newa.txt”));
ArrayList array = new ArrayList();
array.add(“hello”);
array.add(“world”);
array.add(“java”);
Files.write(Paths.get(“f.txt”),array, Charset.defaultCharset());
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
总结
以上是字节二面的一些问题,面完之后其实挺后悔的,没有提前把各个知识点都复习到位。现在重新好好复习手上的面试大全资料(含JAVA、MySQL、算法、Redis、JVM、架构、中间件、RabbitMQ、设计模式、Spring等),现在起闭关修炼半个月,争取早日上岸!!!
下面给大家分享下我的面试大全资料
- 第一份是我的后端JAVA面试大全
后端JAVA面试大全
- 第二份是MySQL+Redis学习笔记+算法+JVM+JAVA核心知识整理
MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理
- 第三份是Spring全家桶资料
MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-hFVilN7J-1712165505149)]
总结
以上是字节二面的一些问题,面完之后其实挺后悔的,没有提前把各个知识点都复习到位。现在重新好好复习手上的面试大全资料(含JAVA、MySQL、算法、Redis、JVM、架构、中间件、RabbitMQ、设计模式、Spring等),现在起闭关修炼半个月,争取早日上岸!!!
下面给大家分享下我的面试大全资料
- 第一份是我的后端JAVA面试大全
[外链图片转存中…(img-2o9bs6pf-1712165505150)]
后端JAVA面试大全
- 第二份是MySQL+Redis学习笔记+算法+JVM+JAVA核心知识整理
[外链图片转存中…(img-PscXXdzs-1712165505150)]
MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理
- 第三份是Spring全家桶资料
[外链图片转存中…(img-aQA9bVXr-1712165505150)]
MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算