Java 学习(26)---(IO流之Properties 类 / 合并流 / 序列化流 / 随机访问流)

本文涉及的产品
系统运维管理,不限时长
简介: Properties(1)是一个集合类, Hashtable 的子类(2)特有功能A:public Object setProperty(String key,String value) ; // 添加元素...

Properties

(1)是一个集合类, Hashtable 的子类

(2)特有功能

A:public Object setProperty(String key,String value) ; // 添加元素

B:public String getProperty(String key) ; // 根据键获取元素

C:public Set<String> 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)案例:

A:根据给定的文件判断是否有键为 "lisi" 的,如果有就修改其值为 100

//	把文件中的数据加载到集合中
Properties	prop = new Properties();
Reader	r =	new FileReader( "user.txt" );
prop.load(r);
r.close();
//	遍历集合,获取得到每一个键
Set<String> set = prop.stringPropertyNames();
for	(String key : set) {
//判断键是否有为	"lisi" 的,如果有就修改其值为 "100"
if ( "lisi" .equals(key)) {
    prop .setProperty( key ,"100");
    break ;
 }
}

//	把集合中的数据重新存储到文件中
Writer	w =	new FileWriter(	"user.txt"); prop.store(w,null);
w.close();
AI 代码解读

 

合并流 (理解即可 )

(1)把多个输入流的数据写到一个输出流中。

(2)构造方法:

A:SequenceInputStream(InputStream s1, InputStream s2)

B:SequenceInputStream(Enumeration<? extends InputStream> e)

// 需求:把下面的三个文件的内容复制到 Copy.java 中

// ByteArrayStreamDemo.java,CopyFileDemo.java,DataStreamDemo.java

// SequenceInputStream(Enumeration e)

// 通过简单的回顾我们知道了 Enumeration 是Vector 中的一个方法的返回值类型。

// Enumeration<E> elements()

Vector<InputStream> v = new Vector<InputStream>();
InputStream	s1	=	new FileInputStream(	"ByteArrayStreamDemo.java"	
InputStream	s2	=	new FileInputStream(	"CopyFileDemo.java"	);	
InputStream	s3	=	new FileInputStream(	"DataStreamDemo.java"	);
v.add(s1);
v.add(s2);
v.add(s3);
Enumeration<InputStream>en =v .elements(); 
SequenceInputStream	sis	=new SequenceInputStream(en );
//	或 SequenceInputStream sis = new SequenceInputStream(s1,s2,s3);
BufferedOutputStream bos =new BufferedOutputStream( new FileOutputStream("Copy.java"));
//	如何写读写呢,其实很简单,你就按照以前怎么读写,现在还是怎么读写
byte [] bys  =	newbyte	[1024]; int	len = 0;
while	((len = sis.read(bys)) != -1) {
bos .write(	bys , 0,	len );
}
bos.close();
sis.close();
AI 代码解读

序列化流 (理解)

(1)可以把对象写入文本文件或者在网络中传输

(2)如何实现序列化呢 ?

让被序列化的对象所属类实现序列化接口。

java.io.Serializable:该接口是一个标记接口。没有功能需要实现。


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

(3)注意问题:

把数据写到文件后,在去修改类会产生一个问题。如何解决该问题呢 ?

在类文件中,给出一个固定的序列化 id 值。而且,这样也可以解决黄色警告线问题

private staticvoid	read()	throws	IOException, ClassNotFoundException {
//	创建反序列化对象
ObjectInputStream ois =	new ObjectInputStream(	new FileInputStream( "oos.txt"	));
//	还原对象
Object obj = ois.readObject();
//	释放资源
ois.close();
//	输出对象
System.	out .println(obj);
}

privatestaticvoid	write()	throws	IOException {
//	创建序列化流对象
ObjectOutputStream oos =	new ObjectOutputStream(	new FileOutputStream(
"oos.txt"	));
//	创建对象
Person p =	new Person(	" 林青霞 " , 27);
// public final void writeObject(Object obj) oos.writeObject(p);
//	释放资源
oos.close();
}
AI 代码解读

什么是序列化 ?

答:把对象按照流一样的方式存入文本文件或者在网络中传输。对象 -- 流数据(ObjectOutputStream)

什么是反序列化 ?

答:把文本文件中的流对象数据或者网络中的流对象数据还原成对象。 流数据-- 对象 (ObjectInputStream)

随机访问流

RandomAccessFile类不属于流,是 Object 类的子类。但它融合了 InputStream  和 OutputStream  的功能。支持对文件的随机访问读取和写入。

public RandomAccessFile(String name,String mode) : 第一个参数是文件路径,第二个参数是操作文件的模式。

模式有四种,我们最常用的一种叫 "rw", 这种方式表示我既可以写数据,也可以读取数据

private staticvoid read() throws	IOException {
//	创建随机访问流对象
RandomAccessFile raf = newRandomAccessFile("raf.txt" ,"rw");
int	i = raf.readInt(); System. out .println(i);
//	该文件指针可以通过 getFilePointer 方法读取,并通过	seek 方法设置。
System. out .println(" 当前文件的指针位置是:	" + raf.getFilePointer());
char ch = raf.readChar(); System. out .println(ch);
System. out .println(" 当前文件的指针位置是:" + raf.getFilePointer());
String s = raf.readUTF(); System. out .println(s);
System.  out .println(	" 当前文件的指针位置是:	" + raf.getFilePointer());
//	我不想重头开始了,我就要读取 a,怎么办呢 ?
raf.seek(4);
ch = raf.readChar(); 
System. out .println(ch);
}
privatestaticvoid write() throws	IOException {
//	创建随机访问流对象
RandomAccessFile raf = new RandomAccessFile("raf.txt",	"rw" );
//	怎么玩呢 ?
raf.writeInt(100);
raf.writeChar('a');
raf.writeUTF("中国");
raf.close();
}
AI 代码解读

 

目录
打赏
0
0
0
0
2
分享
相关文章
Java线程池ExecutorService学习和使用
通过学习和使用Java中的 `ExecutorService`,可以显著提升并发编程的效率和代码的可维护性。合理配置线程池参数,结合实际应用场景,可以实现高效、可靠的并发处理。希望本文提供的示例和思路能够帮助开发者深入理解并应用 `ExecutorService`,实现更高效的并发程序。
46 10
【潜意识Java】深度分析黑马项目《苍穹外卖》在Java学习中的重要性
《苍穹外卖》项目对Java学习至关重要。它涵盖了用户管理、商品查询、订单处理等模块,涉及Spring Boot、MyBatis、Redis等技术栈。
251 4
【潜意识Java】Java基础教程:从零开始的学习之旅
本文介绍了 Java 编程语言的基础知识,涵盖从简介、程序结构到面向对象编程的核心概念。首先,Java 是一种高级、跨平台的面向对象语言,支持“一次编写,到处运行”。接着,文章详细讲解了 Java 程序的基本结构,包括包声明、导入语句、类声明和 main 方法。随后,深入探讨了基础语法,如数据类型、变量、控制结构、方法和数组。此外,还介绍了面向对象编程的关键概念,例如类与对象、继承和多态。最后,针对常见的编程错误提供了调试技巧,并总结了学习 Java 的重要性和方法。适合初学者逐步掌握 Java 编程。
62 1
|
5月前
|
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
136 43
Java学习十六—掌握注解:让编程更简单
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
110 1
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等