JavaSE 对象流

本文介绍了Java中如何使用ObjectOutputStream进行对象序列化,将对象状态保存为字节流;以及如何使用ObjectInputStream进行对象反序列化,从字节流中恢复对象状态。示例代码展示了完整的序列化与反序列化过程。

 

ObjectOutputStreamObjectInputStream分别代表对象字节输出流和对象字节输入流,其功能分别是:

ObjectOutputStream

提供了writeObject(Serializable)方法,将对象转化成字节流再输出到目标字节流中去。这一个过程称为序列化。需要序列化的类必须实现Serializable接口。

ObjectInputStream

提供了Object readObject()方法,将字节输入流转化成对象。这一个过程称为序列化

   

示例1代码:

  class Student implements Serializable{

private String name;

private int age;

public Student(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 "Student [name=" + name + ", age=" + age + "]";

}

}

public class TestObjectOutputStream {

public static void main(String[] args) {

ObjectOutputStream oos=null;

FileOutputStream fos=null;

try {

fos = new FileOutputStream("obj.dat");

oos=new ObjectOutputStream(fos);

Student s=new Student("Jack",20);

oos.writeObject(s);

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}finally{

try {

if(oos!=null)oos.close();

if(fos!=null)fos.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

 

 

 

示例2代码:

public class TestObjectInputStream {

public static void main(String[] args) {

ObjectInputStream ois=null;

FileInputStream fis=null;

try {

fis = new FileInputStream("obj.dat");

ois=new ObjectInputStream(fis);

Student s=(Student) ois.readObject();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

}finally{

try {

if(ois!=null)ois.close();

if(fis!=null)fis.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

 

### Java SE IO流学习教程 #### 一、简介 Java 输入/输出 (I/O) 是指通过数据源读取数据或将数据写入到数据目的地的过程。Java 提供了一套丰富的类库来处理不同类型的 I/O 操作,这些操作被封装在 `java.io` 包中。 #### 二、基本概念 - **字节流** 和 **字符流**: 字节流用于传输原始的8位字节数据;而字符流则专门针对Unicode编码的文字进行处理[^1]。 - **节点流** 和 **过滤流(包装流)**: 节点流直接连接到底层资源(如文件),而过滤流则是基于其他已存在的流之上构建的功能增强型流[^3]. #### 三、常用类介绍 ##### 文件输入输出流 对于简单的文件读写任务可以使用如下两个基础类: - `FileInputStream/FileOutputStream`: 这些是最基本的形式之一,适用于任何类型的文件内容传输[^2]. - `FileReader/FileWriter`: 当只需要处理纯文本时可以选择这两个子类,它们内部实现了对字符集转换的支持[^4]. ##### 缓冲区支持 为了提高效率,在实际应用当中通常会搭配Buffered系列来进行优化: - `BufferedReader/BufferedWriter`: 可以为任意reader/writer对象提供缓存机制从而减少磁盘访问次数并加快速度. ```java // 使用带缓冲功能的字符流读取文件示例 import java.io.*; public class BufferedStreamExample { public static void main(String[] args)throws IOException{ try(BufferedReader reader=new BufferedReader(new FileReader("example.txt"))){ String line; while((line=reader.readLine())!=null){ System.out.println(line); } }// 自动调用了close()方法释放资源 } } ``` ##### 数据序列化与反序列化 当涉及到复杂对象保存至外部存储介质或者网络通信场景下,则需要用到Object Stream家族成员完成此过程. - `ObjectInputStream/ObjectOutputStream`: 支持将整个对象图谱按照特定格式持久化下来以便后续恢复原貌. ```java // 序列化对象到文件的例子 import java.io.*; class Person implements Serializable{//注意这里需要实现Serializable接口才能让实例可串行化 private static final long serialVersionUID = 1L; String name; transient int age; // 加上transient修饰符表示该字段不会参与序列化进程 } public class SerializationDemo { public static void writePersonToFile(Person person, File file) throws FileNotFoundException,IOException{ try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file))){ oos.writeObject(person); } } @SuppressWarnings("unchecked") public static <T> T readPersonFromFile(File file) throws ClassNotFoundException,FileNotFoundException,IOException{ Object result=null; try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))){ result=(T)ois.readObject(); } return result; } } ``` #### 四、最佳实践建议 - 总是在finally块内关闭所有打开过的流以防止内存泄漏发生. - 尽量利用try-with-resources语句简化异常管理逻辑同时确保自动清理工作得以执行. - 对于频繁发生的短小读写动作考虑引入适当大小的buffer来降低开销提升性能表现.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值