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

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

Student类:

  1. class Student implements Serializable{
  2. public int id;
  3. public String name;
  4. public String sex;
  5.  
  6. public Student(int id, String name, String sex) {
  7. this.id = id;
  8. this.name = name;
  9. this.sex = sex;
  10. }
  11.  
  12. @Override
  13. public String toString() {
  14. return "Student{" +
  15. "id=" + id +
  16. ", name='" + name + '\'' +
  17. ", sex='" + sex + '\'' +
  18. '}';
  19. }
  20. }

一、

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

  1. //读取对象数据,保存到本地文件中
  2. public static void read() {
  3. //声明一个文件(创建文件)
  4. File file = null;
  5. //声明文件输出字节流
  6. FileOutputStream fos = null;
  7. //声明对象处理流
  8. ObjectOutputStream oos = null;
  9. try {
  10. file = new File("E:\\a.txt");
  11. fos = new FileOutputStream(file);
  12. oos = new ObjectOutputStream(fos);
  13. //向文件中写入对象的数据
  14. oos.writeObject(new Student(1002,"ll","女"));
  15. //清空缓冲区
  16. oos.flush();
  17. } catch (FileNotFoundException e) {
  18. e.printStackTrace();
  19. } catch (IOException e) {
  20. e.printStackTrace();
  21. }finally {
  22. try {
  23. //关闭资源
  24. fos.close();
  25. oos.close();
  26. } catch (IOException e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. }
  1. //从文件中把对象数据读取出来打印
  2. public static void write() {
  3. File file = null;
  4. FileInputStream fis = null;
  5. ObjectInputStream ois = null;
  6. try {
  7. file = new File("E:\\a.txt");
  8. fis = new FileInputStream(file);
  9. ois = new ObjectInputStream(fis);
  10. Student s = (Student)ois.readObject();
  11. System.out.println(s);
  12. } catch (FileNotFoundException e) {
  13. e.printStackTrace();
  14. } catch (IOException e) {
  15. e.printStackTrace();
  16. } catch (ClassNotFoundException e) {
  17. e.printStackTrace();
  18. } finally {
  19. try {
  20. fis.close();
  21. ois.close();
  22. } catch (IOException e) {
  23. e.printStackTrace();
  24. }
  25. }
  26. }

二、

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

  1. public static void read() {
  2. //声明一个文件(创建文件)
  3. File file = null;
  4. //声明文件输出字节流
  5. FileOutputStream fos = null;
  6. //声明对象处理流
  7. ObjectOutputStream oos = null;
  8. try {
  9. file = new File("E:\\a.txt");
  10. fos = new FileOutputStream(file);
  11. oos = new ObjectOutputStream(fos);
  12. oos.writeObject(new Student(1001,"llli","女"));
  13. oos.writeObject(new Student(1002,"ll","女"));
  14. //清空缓冲区
  15. oos.flush();
  16. } catch (FileNotFoundException e) {
  17. e.printStackTrace();
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. }finally {
  21. try {
  22. //关闭资源
  23. fos.close();
  24. oos.close();
  25. } catch (IOException e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. }

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

  1. public static void write() {
  2. File file = null;
  3. FileInputStream fis = null;
  4. ObjectInputStream ois = null;
  5. try {
  6. file = new File("E:\\a.txt");
  7. fis = new FileInputStream(file);
  8. ois = new ObjectInputStream(fis);
  9. Student s = (Student)ois.readObject();
  10. System.out.println(s);
  11. Student s1 = (Student)ois.readObject();
  12. System.out.println(s1);
  13. } catch (FileNotFoundException e) {
  14. e.printStackTrace();
  15. } catch (IOException e) {
  16. e.printStackTrace();
  17. } catch (ClassNotFoundException e) {
  18. e.printStackTrace();
  19. } finally {
  20. try {
  21. fis.close();
  22. ois.close();
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. }

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

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

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

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

  1. oos.writeObject(new Student(1001,"llli","女"));
  2. oos.writeObject(new Student(1002,"ll","女"));
  3. 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. Java--JDBC连接数据库(二)

    本篇文章接着上篇文章,还剩下一个知识点是,可滚动的结果接集和可更新的结果集.一般默认情况之下,多结果集是不可以显式滚动,移动选择的.如果想要做到,需要指定一些参数,那么本篇就接着介绍如何操作可滚动的结 ...

  2. [HNOI2014]道路堵塞

    题目描述 A国有N座城市,依次标为1到N.同时,在这N座城市间有M条单向道路,每条道路的长度是一个正整数.现在,A国交通部指定了一条从城市1到城市N的路径,并且保证这条路径的长度是所有从城市1到城市N ...

  3. java-数据库连接,分层实现增删改查测试

    成员属性类: public class Dog { private int number; private String name; private String strain; private St ...

  4. apue.h头文件(UNIX环境高级编程)

    在看UNIX环境高级编程是,碰到一个头文件"apue.h",搜一下别人的帖子,其实apue.h是作者自己写的一个文件,包含了常用的头文件,系统不自带.其中包含了常用的头文件,以及出 ...

  5. uclibc和glibc的差别

    uClibc和Glibc并不相同,两者有许多不同之处,而且以下不同有可能给你带来一些问题. 1. uClibc比Glibc小,虽然uClibc和Glibc在已有的接口上是兼容的,而且采用uClibc编 ...

  6. 使用mongoVUE删除大量数据的情况下失效问题

    昨天有一个系统出现了问题,导致半夜时大量的错误数据产生,早晨一早接到上边通知让把这些数据尽数删除. 不可否认在数据操作时mongoVUE更加直观,因此一般情况下我也都是使用这个工具,但是今天却出现了问 ...

  7. Windows Subsystem for Linux (WSL)挂载移动硬盘U盘

    WSL想通过移动硬盘处理一些数据,结果进去了无法发现移动硬盘,于是搜了好久也没有一个正确的解决办法,终于找到一个,现在贡献出来与大家共享. WSL比起linux挂载硬盘简单一些.而且windows本身 ...

  8. 关于linux下的嵌入式文件系统以及flash文件系统选择

    嵌入式linux下常见的文件系统 • RomFS:只读文件系统,可以放在ROM空间,也 可以在系统的RAM中,嵌入式linux中常用来作 根文件系统 • RamFS:利用VFS自身结构而形成的内存文件 ...

  9. JavaScript获取当前日期

    JavaScript获取当前日期 具体实现如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

  10. Excel 2010高级应用-圆环图(七)

    Excel 2010高级应用-圆环图(七) 基本操作如下: 1.新建空白Excel文档,并命名为圆环图 2.单击"插入",并找到圆环图图样 3.单击圆环图图样,并在空白文档上生成图 ...