把对象进行持久化(把对象存到本地)要用到对象流进行处理,在用对象流处理过程中,在写对象和读对象时候遇到了很多问题,分享一下。

我们处理对象数据的时候不可能只处理一个对象,在系统运行的时候,可能产生的对象数量是随机的,对于向文件中写入对象数据没有什么影响,只需要向文件中写入正确的对象即可,但是从文件中读取对象操作的时候就需要我们进行判断结束标志在哪里,什么时候结束读操作,如果不能判断在哪里结束,程序就会报错,抛出异常。

Student类:

class Student implements Serializable{
public int id;
public String name;
public String sex; public Student(int id, String name, String sex) {
this.id = id;
this.name = name;
this.sex = sex;
} @Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
}

一、

在对一个对象进行处理的时候,我们不需要关心哪里结束,注意在最后要清空缓冲区和关闭资源

//读取对象数据,保存到本地文件中
public static void read() {
//声明一个文件(创建文件)
File file = null;
//声明文件输出字节流
FileOutputStream fos = null;
//声明对象处理流
ObjectOutputStream oos = null;
try {
file = new File("E:\\a.txt");
fos = new FileOutputStream(file);
oos = new ObjectOutputStream(fos);
//向文件中写入对象的数据
oos.writeObject(new Student(1002,"ll","女"));
//清空缓冲区
oos.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
//关闭资源
fos.close();
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//从文件中把对象数据读取出来打印
public static void write() {
File file = null;
FileInputStream fis = null;
ObjectInputStream ois = null;
try {
file = new File("E:\\a.txt");
fis = new FileInputStream(file);
ois = new ObjectInputStream(fis);
Student s = (Student)ois.readObject();
System.out.println(s);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
fis.close();
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

二、

当创建的对象数量不确定的时候,加入我们创建了两个Student对象,并写入文件中

 public static void read() {
//声明一个文件(创建文件)
File file = null;
//声明文件输出字节流
FileOutputStream fos = null;
//声明对象处理流
ObjectOutputStream oos = null;
try {
file = new File("E:\\a.txt");
fos = new FileOutputStream(file);
oos = new ObjectOutputStream(fos);
oos.writeObject(new Student(1001,"llli","女"));
oos.writeObject(new Student(1002,"ll","女"));
//清空缓冲区
oos.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
//关闭资源
fos.close();
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

如果我们知道文件中有两个对象的数据,我们可以读取两次,调用两次读取方法,分别读取s和s1

 public static void write() {
File file = null;
FileInputStream fis = null;
ObjectInputStream ois = null;
try {
file = new File("E:\\a.txt");
fis = new FileInputStream(file);
ois = new ObjectInputStream(fis);
Student s = (Student)ois.readObject();
System.out.println(s);
Student s1 = (Student)ois.readObject();
System.out.println(s1);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
fis.close();
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

但是往往我们不知道系统中保存了几个对象,再说假如知道了对象的数量,这样的代码也是很不简洁的,几百个对象我们就要写几百个调用readObject()方法的语句,这时候我们想到了用while循环,当判断文件中没有对象数据的时候结束访问,把上面调用两次readObject()方法的语句换成下面这样,放在while循环中

Object obj = null;
while ((obj=ois.readObject()) != null) {
System.out.println(obj);
}

程序运行出错了,程序可以读取到第一个对象,但是当遇到第二个对象的时候,程序再向后执行不能判断结束标志在哪里抛出EOFException

既然没有结束标志我们在文件中加入一个结束标志,我们在之前的read()方法中,向文件中写入对象的时候最后加上写入一个null

oos.writeObject(new Student(1001,"llli","女"));
oos.writeObject(new Student(1002,"ll","女"));
oos.writeObject(null);

这样程序在执行的时候,遇到这个null的时候就知道结束了,可以正确的操作

Java使用对象流读取文件的问题的更多相关文章

  1. Java IO流读取文件

    使用指定编码读取文件 public static String toString(File file, String charset){ StringBuilder result = new Stri ...

  2. java字符流读取文件

    package ba; import java.io.*; public class zifuTest { public static void main(String[] args) { FileI ...

  3. Java:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...

  4. Java 运用流传输文件

    实例1 package IO; import java.io.FileReader; import java.io.FileWriter; import java.io.Reader; import ...

  5. java IO流读取图片供前台显示

    最近项目中需要用到IO流来读取图片以提供前台页面展示,由于以前一直是用url路径的方式进行图片展示,一听说要项目要用IO流读取图片感觉好复杂一样,但任务下达下来了,做为程序员只有选择去执行喽,于是找了 ...

  6. java io流 对文件夹的操作

    java io流 对文件夹的操作 检查文件夹是否存在 显示文件夹下面的文件 ....更多方法参考 http://www.cnblogs.com/phpyangbo/p/5965781.html ,与文 ...

  7. java io流 创建文件、写入数据、设置输出位置

    java io流 创建文件 写入数据 改变system.out.print的输出位置 //创建文件 //写入数据 //改变system.out.print的输出位置 import java.io.*; ...

  8. Java 字符流实现文件读写操作(FileReader-FileWriter)

    Java 字符流实现文件读写操作(FileReader-FileWriter) 备注:字符流效率高,但是没有字节流底层 字节流地址:http://pengyan5945.iteye.com/blog/ ...

  9. java多线程批量读取文件(七)

    新公司入职一个多月了,至今没有事情可以做,十来个新同事都一样抓狂,所以大家都自己学习一些新东西,我最近在看zookeeper,感觉蛮不错的,和微服务的zuul以及eureka功能类似,只是代码复杂了一 ...

随机推荐

  1. DataTable筛选某列最大值

    dt.Compute("max(列名)",""); Compute函数的参数就两个:Expression,和Filter. Expresstion是计算表达式, ...

  2. mysql常用基础操作语法(九)~~外连接查询【命令行模式】

    1.左外连接left outer join或者left jion,outer可以省略不写,下边的右连接和全连接也一样: 左外连接的意思是,以left join左边的表中的数据为基准,即左边的表中有的必 ...

  3. 一种在BIOS中嵌入应用程序的方法及实现

    本文针对Award公司开发的计算机系统BIOS提出了一种嵌入应用程序的方法,其基本原理对别的品牌的BIOS也一样适用,仅需稍加修改.文中作者给出并讨论一个完整的例子程序,该程序已经通过实验验证.  正 ...

  4. 【mongodb系统学习之十】mongodb查询(二)

    5).常用查询条件: a).比较操作符:"$lt","$lte","$gt","$gte",分别是<,<=, ...

  5. PL/SQL集合 ----- varrays

    varrays可以再表,记录,对象定义中使用,类似于C中的数组. 1.定义varrays用作PL/SQL程序构造块. declare type integer_varray ) of integer; ...

  6. freemarker自定义标签(一)

    freemarker自定义标签 1.自定义标签说明 宏变量存储模板片段可以被用作自定义指令macro 2.示例说明 <html> <head> <meta http-eq ...

  7. TypeError: Error #1034: 强制转换类型失败:无法将 "0.49" 转换为 mx.graphics.IFill。

    1.错误描述 TypeError: Error #1034: 强制转换类型失败:无法将 "0.49" 转换为 mx.graphics.IFill. at mx.charts.ser ...

  8. 【原】无脑操作:IDEA + maven + SpringBoot + JPA + Thymeleaf实现CRUD及分页

    一.开发环境: 1.windows 7 企业版 2.IDEA 14 3.JDK 1.8 4.Maven 3.5.2 5.MariaDB 6.SQLYog 二.Maven设置: Maven目录下的con ...

  9. 关于json.parse和json.stringify的区别

    json.parse是将字符串解析成json格式 而json.stringify是将json解析成字符串格式

  10. PhotoShop制作简单的文字动画--多媒体技术与应用

    下面是最终实现的效果图: 1.新建图像,设置图像属性如下所示. 2.使用[横排文字工具]在背景图像上打上文字内容 3.[图层]——>[图层式样]——>[渐变叠加] 出现“图层样式”面板 4 ...