Java核心库——IO(三)

本文详细介绍了Java中的序列化与反序列化概念及其实现方法,包括对象流的操作、扫描器类的使用、properties类的应用等。此外还概述了不同类型的IO流及其用途。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.序列化和反序列化
序列化:把堆内存中的java对象数据,通过某种方式存储到磁盘文件中或者传递给其他网络节点(网络传播时候)
反序列化:把磁盘中文件的对象数据或者网络节点上的对象数据,恢复成java对象的过程

为什么要做序列化:
(1)在分布式系统中,需要共享的数据的JavaBean对象都得做序列化,此时需要把对象在网路络上传输,此时旧的把对象数据转换为二进制形式
以后存储在HttpSession中的uid,都应该实现序列化接口(只有实现序列化接口的类,才能做序列化操作)
(2)服务器钝化:如果服务器发现某些对象很久没有活动,此时服务器要把这些内存中的对象,持久化在本地磁盘文件(java对象——>二进制文件)
如果某些对象需要活动的时候,先在内存中去寻找,找不到再去磁盘我呢见在,反序列化我们的对象数据,恢复成java对象
需要做序列化的对象的类,必须实现序列化接口
java.io Interface Serializable,标志接口:没有抽象方法
boolean rot = 对象 instanceof Serializable
在java中大多数类都已经实现了Serializable接口
----------------------------------------
使用对象流来完成序列化和反序列化:
ObjectInputStream :通过writerObject方法做序列化操作
ObjectOutputStream:通过readerObject方法做反序列化操作
此时报错是因为没有实现Serializable接口
User
//需要序列化操作的对象
public class User implements Serializable{
	String name;
	int age;
	String career;
	String password;
	public User(String name, int age, String career, String password) {
		super();
		this.name = name;
		this.age = age;
		this.career = career;
		this.password = password;
	}
	public String toString() {
		return "User [name=" + name + ", age=" + age + ", career=" + career + ", password=" + password + "]";
	}
	
	
}
ObjectStreamDemo
//通过文件输出流来实现序列化/反序列化操作操作
public class ObjectStreamDemo {
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		File f = new File("file/objstream.txt");
		//writeObject(f);
		readObject(f);
	}
	public static void readObject(File f) throws IOException, ClassNotFoundException {
		FileInputStream fis = new FileInputStream(f);
		ObjectInputStream ois = new ObjectInputStream(fis);
		Object obj = ois.readObject();
		System.out.println(obj);
		ois.close();
	}
	//序列化操作
	public static void writeObject(File f) throws IOException {
		FileOutputStream fos = new FileOutputStream(f);
		ObjectOutputStream oos = new ObjectOutputStream(fos); 
		oos.writeObject(new User("allen",17,"programmer","qweasd123"));
		oos.close();
	}
	
}

2.扫描器类:输入操作
//扫描器类
public class ScannerDemo {
public static void main(String[] args) throws IOException {
//扫描键盘输入的数据
Scanner sc = new Scanner(System.in);
while( sc.hasNext()){
String si = sc.nextLine();
System.out.println(si);
}
sc.close();
}
}

3.properties类资源加载文件
资源文件(以properties作为扩展名的文件)/属性文件:

做项目开发,为何使用配置文件?
把所有的数据存储在代码中,写死“硬编码”。
数据库的链接信息保存在db.properties文件中,而java代码需要获取该文件中的信息
java如何加载propertie文件,如何获取该文件中的数据
必须使用properies类(Hashtable的子类,map接口的实现类)

public class LoadResourceDemo {
public static void main(String[] args) throws IOException {
//创建properties对象
Properties p = new Properties();
InputStream in =new FileInputStream("D:/javaApp2/IO/src/db.properties");
//加载输入流中的数据,加载之后数据都在p对象中
p.load(in);
System.out.println(p);
System.out.println("账号: "+ p.getProperty("username"));
System.out.println("密码: "+ p.getProperty("password"));
}
}

----------------------------------------------------
4.数据流:提供了可以写/读任意数据类型的方法
DataOutputStream 提供了 wrtieXxx()方法
DataInputStream 提供了readXxx()方法
注意:wrtieXxx和 readXxx必须对应起来,writeByte 写出的数据必须用 readByte读取
//数据流
public class DataStreamDemo {
	public static void main(String[] args) throws IOException {
		File f = new File("file/out.txt");
		write(f);//写数据流
		read(f);//度数据流
	}

	public static void read(File f) throws IOException {
		DataInputStream in = new DataInputStream(new FileInputStream(f));
		System.out.println(in.readByte());
		System.out.println(in.readInt());
		System.out.println(in.readUTF());
		in.close();
	}

	public static void write(File f) throws IOException {
		DataOutputStream dout = new DataOutputStream(new FileOutputStream(f));
		dout.writeByte(65);
		dout.writeInt(12);
		dout.writeUTF("AA");
		dout.close();
	}
}
---------------------------------------
randomaccessfile经常用来做多线程断点下载:
1)多线程
2)断点下载
------------------------------
5.管道流:实现两个线程直接的数据交互
pipedinputstream
pipedoutputstream
pipedwriter
pipedreader


----------------------------
6.总结:
四大基流:
InputStream——OutputStream
Reader ——Writer
文件流:
FileInputStream
FileOutputStream
FileReader
FileWriter
缓冲流:
BufferedInputStream
BufferedOutputStream
BufferedReader
BufferedWriter
转换流(字节转换为字符):
InputStreamReader
OutputStreamWriter
内存流(临时存储数据):
ByteArrayInputStream
ByteArrayOutputStream
CharArrayReader
CharArrayWriter
StringArrayWriter
StringArrayReader
合并流(顺序流):
SequenceInputStream
对象流:序列化和反序列化
ObjectInputStream
ObjectOutputStream
打印流:
PrintStream
PrintWriter
数据流:
DataInputStream
DataOutputStream
管道流:
PipedInputStream
PipedOutputStream
PipedReader
PipedWriter

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值