java基础io流——配角也风流(不求甚解,Java就业班资料

(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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

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

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

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

总结

以上是字节二面的一些问题,面完之后其实挺后悔的,没有提前把各个知识点都复习到位。现在重新好好复习手上的面试大全资料(含JAVA、MySQL、算法、Redis、JVM、架构、中间件、RabbitMQ、设计模式、Spring等),现在起闭关修炼半个月,争取早日上岸!!!

下面给大家分享下我的面试大全资料

  • 第一份是我的后端JAVA面试大全

image.png

后端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、安卓逆向、云计算

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值