`

java基础--ObjectInputStream和ObjectInputStream类

阅读更多

ObjectInputStream和ObjectInputStream类创建的对象被称为对象输入流和对象输出流。

创建文件输出流代码:

FileOutputStream file_out = new FileOutputStream(“student.dat”);

ObjectOutputStream object_out = new ObjectOutputStream(file_out);

创建文件输入流代码:

FileInputStream   file   =   new   FileInputStream( "student.dat ");

ObjectInputStream   ois   =   new   ObjectInputStream(file);

问题描述:

向一个文件中写入一个对象,可以用ObjectOutputStream套接FileOutputStream来实现(序列化)。但如果想向一个文件中写入多个对象并且能够正确读出来,用它们该如何实现?一种方法是在FileOutputStream和ObjectOutputStream之间再套接一个BufferedInputStream,每写入一个对象,换一行,再写个对象,再换一行。读取的时候,同样在中间套接个FileInputStream,每读一行,读出一个对象,再读一行,又读出个对象。然而这种方法非常的繁琐,且效率低。

知识储备:

使用对象流写入或读入对象时,要保证对象是序列化的。这是为了保证能把对象写入到文件,并能再把对象读回到程序中的缘故。一个类如果实现了Serializable接口,那么这个类创建的对象就是所谓序列化的对象。所谓“对象序列化”:简单一句话:使用它可以象存储文本或者数字一样简单的存储对象。一个应用是,程序在执行过程中突然遇到短电或者其他的故障导致程序终止,那么对象当前的工作状态也就会丢失,这对于有些应用来说是可怕的。用对象序列化就可以解决这个问题,因为它可以将对象的全部内容保存于磁盘的文件,这样对象执行状态也就被存储了,到需要时还可以将其从文件中按原样再读取出来,这样就解决了数据丢失问题。对象序列化可以简单这么实现:为需要被序列化的对象实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

上述问题解决方法:

该对象首先要可序列化,然后把多个对象存储到容器里,如ArrayList<?> list; 
然后把list序列化存储,读出来就是一串对象了。

 

 

 

例子一:参考资料http://dev.csdn.net/article/31/31129.shtm

              http://zhidao.baidu.com/question/26665922.html?si=4

 

import java.io.*; 
import java.util.*; 

public class ObjectFileTest 

public static void main(String[] args) 

Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15); 
boss.setBonus(5000); 

Employee[] staff = new Employee[3]; 
staff[0] = boss; 
staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 15); 
staff[2] = new Employee("Tony Tester", 40000, 1990, 1, 15); 

try 

/** 
*使用文件输出流构造一个对象输出流

*FileOutputStream
文件输出流
*ObjectOutputStream
对象输出流
*/ 
ObjectOutputStream out = new ObjectOutputStream(new 
FileOutputStream("employee.dat")); 
out.writeObject(staff); //
将对象写入"employee.dat"中
out.close(); //
关闭流,请牢记

/** 
*
使用文件输入流构造一个对象输入流
*FileInputStream
文件输入流
*ObjectInputStream
对象输入流
*/ 
ObjectInputStream in = new ObjectInputStream(new 
FileInputStream("employee.dat")); 
///readObject()
将对象从"employee.dat"中读出,需要类型转换
Employee[] newStaff = (Employee[])in.readObject(); 
in.close(); 

for (int i = 0; i < newStaff.length; i++) 
System.out.println(newStaff[i]); 

catch (Exception e) 

e.printStackTrace(); 





///implements Serializable
接口为标注该对象是可序列化的

class Employee implements Serializable 

public Employee() {} 

public Employee(String n, double s, int year, int month, int day) 

name = n; 
salary = s; 
GregorianCalendar calendar = 
new GregorianCalendar(year, month - 1, day); 
hireDay = calendar.getTime(); 


public String getName() 

return name; 


public double getSalary() 

return salary; 


public Date getHireDay() 

return hireDay; 


public void raiseSalary(double byPercent) 

double raise = salary * byPercent / 100; 
salary += raise; 


public String toString() 

return getClass().getName() 
+ "[name = "+ name 
+ ",salary = "+ salary 
+ ",hireDay = "+ hireDay 
+ "]"; 


private String name; 
private double salary; 
private Date hireDay; 



class Manager extends Employee 

public Manager(String n, double s, int year, int month, int day) 

super(n, s, year, month, day); 
bonus = 0; 


public double getSalary() 

double baseSalary = super.getSalary(); 
return baseSalary + bonus; 


public void setBonus(double b) 

bonus = b; 


public String toString() 

return super.toString() 
+ "[bonus = "+ bonus 
+ "]"; 


private double bonus; 

}

 

例子二:

//*********下面是序列化的代码*******

import   java.io.FileOutputStream;

import   java.io.ObjectOutputStream;

import   java.io.FileNotFoundException;

import   java.io.FileInputStream;

import   java.io.ObjectInputStream;

import   java.io.IOException;

 

public   class   Test   {

 

public   static   void   main(String[]   args)

{

Student[]   student   ={new   Student( "student1 ",22, "男 "),

new   Student( "student2 ",21, "女 "),

new   Student( "student3 ",20, "男 "),

new   Student( "student4 ",19, "女 "),

new   Student( "student5 ",18, "男 "),

new   Student( "student6 ",17, "男 "),

new   Student( "student7 ",22, "女 "),

new   Student( "student8 ",22, "女 "),

new   Student( "student9 ",22, "女 "),

new   Student( "student10 ",22, "男 "),};

 

try

{

//写入文件

ObjectOutputStream   oos   =   new   ObjectOutputStream(

new   FileOutputStream( "haoguicai000.txt "));

oos.writeObject(student);//这里存的是数组对象,你也可以用循环把每一个Student对象写进去。

oos.close();

 

//从文件中读出对象

Student[]   students2;

FileInputStream   file   =   new   FileInputStream( "haoguicai000.txt ");

ObjectInputStream   ois   =   new   ObjectInputStream(file);

 

students2   =   (Student[])ois.readObject();

 

for(Student   s   :students2)

{

System.out.println( "姓名: "+s.getName());

System.out.println( "年龄: "+s.getAge());

System.out.println( "性别 "+s.getSex());

}

 

/*while(file.available()> 0)

System.out.println(((Student)ois.readObject()).getName()); 法二*/

ois.close();

file.close();

 

 

 

}

catch(FileNotFoundException   ex)

{

ex.printStackTrace();

}

catch(IOException   ex)

{

ex.printStackTrace();

}

catch(ClassNotFoundException   ex)

{

ex.printStackTrace();

}

}

}

 

 

例三:

 

import java.awt.*;

import java.io.*;

import java.util.*;

import javax.swing.*;

 

class Student  implements   Serializable  

{

    int id;

    String name;

    int score;

    Student(int id,String name,int score)

    {

        //创建一个学号为id,姓名为name,成绩为score的学生对象

        setId(id);

        setName(name);

        setScore(score);

    }

   

    public void setId(int id)

    {

        this.id=id;

    } 

    public int getId()

    {

       return this.id;

    }

  

    public void setName(String name)

    {

        this.name=name;

    }

 

    public String getName()

    {

       return name;

    }

   

    public void setScore(int score)

    {

        this.score=score;

    }

   

    public int getScore()

    {

       return score;

    }

}

/*************************************/

public class ScoreSort

{

    Scanner scanner;

    Student[] student;

    int number;

    File filename;

 

    public ScoreSort()

    {

        System.out.print("输入学生的个数:/n");

        scanner=new Scanner(System.in);

        number=scanner.nextInt();

        try

        {

            if(number<=0) throw new NegativeException();

            input(number);

            writeToFile(student);

        }

        catch(NegativeException e)

        {

            JOptionPane.showMessageDialog(null,"人数小于1!");

        }

    }

   

    public void input(int n)

    {

        student=new Student[n];

       // System.out.println("学号     姓名       成绩");

       

        for(int i=0;i<student.length;i++)

        {     //输入学生的信息

            int j = i+1;

            System.out.println("输入第"+ j +"个学生");

            System.out.println("学号");

            int id=scanner.nextInt();

            System.out.println("姓名");

            String name=scanner.next();

            System.out.println("成绩");

            int score=scanner.nextInt();

            System.out.println("___________________");

            student[i]=new Student(id,name,score);

        }

    }

 

    public void writeToFile(Student[] s)

    {

        try

        {

            ObjectOutputStream   oos   =   new   ObjectOutputStream(

                    new   FileOutputStream( "student.dat "));

            oos.writeObject(student);//这里存的是数组对象,你也可以用循环把每一个Student对象写进去。

            oos.close();

          }

        catch(IOException ex)

        {

            System.out.println("写入文件失败!");

        }

    }

}

/***************************************************/

public class ScoreSort2

    {

        int number=100;

        Student student[];

        File filename;

 

        public ScoreSort2()

        {

            output();

            student=new Student[number];   //限定学生人数

            student=readFromFile();

           

            sort(student);

            System.out.println("排序后:");

            writeToFile(student);

            output();

        }

 

        public void sort(Student s[])

        {

            Student temp = null;  

            for(int i=0;i<s.length;i++)

               {

                   for(int j=0;j<s.length;j++)

                   {

                       if(s[j].getScore()<s[i].getScore())

                       {

                           temp = s[i];

                           s[i] = s[j];

                           s[j] = temp;

                        }

                    }

                }

        }

 

            public Student[] readFromFile()

            {

                //将文件内容读入到数组并返回数组

                Student[] s=null;

                try

                {

                    //从文件中读出对象

                    Student[]   students2;

                    FileInputStream   file   =   new   FileInputStream( "student.dat ");

                    ObjectInputStream   ois   =   new   ObjectInputStream(file);

 

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

                    System.out.println("i am well");

                

                    /*while(file.available()> 0)

                     * System.out.println(((Student)ois.readObject()).getName()); 法二*/

                     ois.close();

                     file.close();

                }

               catch(FileNotFoundException   ex)

               {

                   ex.printStackTrace();

                }

                catch(IOException   ex)

                {

                    ex.printStackTrace();

                }

                catch(ClassNotFoundException   ex)

                {

                    ex.printStackTrace();

                }

                return s;

            }

 

            public void writeToFile(Student[] s)

            {    //将数组s写入到文件student.dat中

                try

                {

                    ObjectOutputStream output=new ObjectOutputStream(new FileOutputStream("student.dat"));

                    output.writeObject(s);

                    output.close();

                }

                catch(IOException ex)

                {

                    JOptionPane.showMessageDialog(null,"写入文件失败!");

                }

            }

 

           public void output()

            {

                Student[] s3=null;

                try

                {

                    ObjectInputStream input=new ObjectInputStream(new FileInputStream("student.dat"));

                    System.out.println("输出文件student.dat的内容:");

                     s3  =   (Student[])input.readObject();

                     for(Student   s   :s3)

                    {

                        System.out.println( "学号: "+s.getId());

                        System.out.println( "姓名: "+s.getName());

                        System.out.println( "成绩 "+s.getScore());

                    }

                    input.close();

                }

                catch(IOException ex)

                {

                    System.err.println("打开文件失败!");

                }

                catch(ClassNotFoundException ex)

                {

                    System.err.println("ERROR");

                }

            }

        }

 

/***************************/

class NegativeException extends Exception

{

    NegativeException(){}

    public String toString()

    {

        return "数字是小于或等于0";

     }

}

/**********************************/

public class Test

{

    public static void main(String[] args)

    {

      

        /*ScoreSort scoresort=new ScoreSort();

         System.exit(0);*/

        ScoreSort2 scoresort2=new ScoreSort2();

        System.exit(0);

    }

}

 

分享到:
评论

相关推荐

    ObjectInputStream的用法---马克-to-win java视频

    ObjectInputStream的用法---马克-to-win java视频的介绍对象输入字节流

    Java基础-IO流(作业,适合Java初学者查看).zip

    ObjectInputStream save = new ObjectInputStream(new FileInputStream( "savegly.txt")); gly = (Manager) save.readObject(); save.close(); /** * 创建系统菜单对像 */ Menu cx = new Menu()...

    java72-java-advance.rar

    1.java语言提供处理不同类型流的类的包是(D) a)java.sql b) java.util c) java.math d) java.io 2.不属于java.io包中的接口的一项是(C) a)DataInput b) DataOutput c) DataInputStream d) ObjectInput 3. ...

    ObjectInputStream

    ObjectInputStream序列化实例,简单就学会,JAVA原来so easy

    JAVA基础课程讲义

    ObjectInputStream和ObjectOutputStream 158 PrintStream 158 Reader 158 Writer 159 FileReader和FileWriter 159 BufferReader和BufferWriter 159 InputStreamReader和OutputStreamWriter 161 JAVA对象的序列化和反...

    AIC的Java课程1-6章

     理解和应用Java异常,常用类,IO,集合和多线程等开发技术。  课时安排  总学时:52学时  授课:48学时 (含约20学时实验)  考试:4学时  预备知识  了解和使用操作系统,...

    java编程基础,应用与实例

    15.4 java.util.StringTokenizer类 238 15.5 java.util.Calendar类 240 15.6 巩固练习 242 第16章 AWT程序设计 244 16.1 java.awt.Component类 244 16.2 java.awt.Container类 247 16.3 布局管理器 ...

    人工智能-项目实践-搜索引擎-java实验1-实现搜索引擎的倒排索引数据结构

    java实验1-实现搜索引擎的倒排索引数据结构 实验1知识点: 集合类的使用如ArrayList,HashMap ◦对这些集合类的操作包括:遍历、添加、排序,得到集合的大小、判断集合里是否已存在指定元素 第三是熟悉对象的序列...

    java项目超市

    import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java....

    java序列化与ObjectOutputStream和ObjectInputStream的实例详解

    主要介绍了java序列化与ObjectOutputStream和ObjectInputStream的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下

    ObjectInputStream 和 ObjectOutputStream 介绍_动力节点Java学院整理

    ObjectInputStream 和 ObjectOutputStream 的作用是,对基本数据和对象进行序列化操作支持。本文给大家详细介绍了ObjectInputStream 和 ObjectOutputStream的相关知识,感兴趣的朋友一起学习吧

    JAVA基础知识点,J2SE部分内容

    JAVA基础知识点,(培训资料).摘要IO讲解一节: 本章和集合很象,可能接触到的类很多,但是重点还是只需要通过掌握常用的几个类的使用来熟悉IO操作。在学习过程中也要和集合一样,首先了解JAVA的整个IO包的结构,然后...

    Java高级程序设计实战教程第五章-Java序列化机制.pptx

    其中包括以下接口和类: java.io.Serializable java.io.Externalizable ObjectOutput ObjectInput ObjectOutputStream ObjectInputStream Java高级程序设计实战教程第五章-Java序列化机制全文共15页,当前为第7页。...

    JAVA_ObjectInputStream

    拿点积分啊,不然不给下东西. Java Object的一个学习源码.

    java上的即时通信

    import java.io.ObjectInputStream; import java.io.IOException; import java.io.EOFException; import java.net.ServerSocket; import java.net.Socket; import java.awt.BorderLayout; import java.awt.Container...

    IO体系.java

    |--ObjectOutputStream/:将java对象的基本数据类型和图形写入到OutputStream。 | |--PipedOutputStream/:可以将管道输出流连接到管道输入流来创建通信管道。 | 用方法connect(PipedInputStream snk) 将此管道...

    java_rpc_demo

    (1)用java写的RPC调用的demo。...(2)没有用到其他的jar包,java对象和流之间的转换用的是java.io.ObjectInputStream和java.io.ObjectOutputStream。 (3)下载解压,可以直接导入Eclipse运行调试。

    人机猜拳游戏(适合Java初学者查看).zip

    游戏类 kaishi = new 游戏类(); 用户类 wan2 = new 用户类(); try { ObjectInputStream savewan1 = new ObjectInputStream( new FileInputStream("savewan1.txt")); ObjectInputStream savewan2 = ...

    通讯录JAVA程序设计实验报告

    程序使用了ObjectInPutStream和ObjectOutPutStream这两个文件输入输出流,利用这两个文件输入输出流,可以方便的直接将通讯记录对象直接写入文件中,另外为了方便添加和删除一条记录还使用了系统的对象数组类...

    Java搜索引擎源代码,爬取项目代码

    搜索引擎爬取源代码 java,为了 File file = new File("D:\\VSE\\Index\\"); String[] list = file.list(); for(int p=0; p; p++){ FileInputStream fis = new FileInputStream( "D:\\VSE\\Index\\_...

Global site tag (gtag.js) - Google Analytics