转: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);

}

}

时间: 2024-10-22 16:24:47

转:ObjectInputStream类和ObjectInputStream类的使用的相关文章

java打开文件夹(含判断操作系统工具类和解压缩工具类)

1.Runtime.getRuntime().exec("explorer D:\\Java"); 2.java.awt.Desktop.getDesktop().open(new File("D:\\Java")); 4.java.awt.Desktop.getDesktop().browse(...) 3. try { String[] cmd = new String[5]; cmd[0] = "cmd"; cmd[1] = "/

JAVA正则表达式:Pattern类与Matcher类详解(转)

java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式. Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查. 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作

【python】-- 类的多继承、经典类、新式类

继承知识点补充 在python还支持多继承,但是一般我们很少用,有些语言干脆就不支持多继承,有多继承,就会带来两个概念,经典类和新式类. 一.多继承 之前我们都是讲的单继承,那么什么是多继承呢?说白了,就是:子类可以继承多个父类,就叫多继承. class SchoolMember(object): #SchoolMember类 '''学校成员基类''' def tell(self): print("the schoolmeber is tell...") class School(ob

JAVA API(一)String类和StringBuffer类

1.String类和StringBuffer类 在程序中经常会用到字符串,所谓的字符串就是指一连串的字符,它是由多个单个字符连接而成的.字符串中可以包含任意字符,这些字符必须包含在一对双引号""之内,如"abc".在Java中定义了String和StringBuffer类来封装字符串,并提供了一系列操作字符串的方法,它们都位于java.lang包中,因此不需要导包就可以直接使用.下面将对String类和StringBuffer类详细讲解. 1.1String类的初始

从设计基类及其派生类看继承关系

继承能够定义可重用.扩展或修改父类行为的子类.但基类的静态构造函数.实例构造函数和析构函数不能被派生类继承. 在下面实例中,定义一个基类Publication用于表示任何类型的出版物以及派生至Publication的其他类型Book类,由此也可以扩展为定义其他类型如:Magazine.Journal.Newspaper和Article. 在设计基类Publication时我们必须考虑到如下关系: 1.要在基类中添加哪些成员 2.基类是否用作派生类模板的抽象基类 3.类层次结构的扩展空间大小,要开

派生类和基类的转换

指针引用分四种情况: 1.直接用基类指针引用基类对象 2.直接用派生指针引用派生对象 3.由基类指针引用派生类对象,由于派生类也是基类对象(包含关系),所以这种引用是安全的.但是只能引用基类成员,若试图通过基类指针引用那些只在派生类中才有的成员,编译器会报告语法错误.(解决该问题的答案是虚函数和多态性) 4.用派生类指针引用基类对象,这种方式会导致编译器报错.必须先把派生类指针强制转换成基类指针. 如果基类和派生类都定义了同名函数,通过对象指针调用成员函数时,到底调用哪里的函数由指针的原始类型决

OC学习篇之---Foundation框架中的NSDictionary类以及NSMutableDictionary类

今天来看一下Foundation框架中的NSDictionary类,NSMutableDictionary类,这个和Java中的Map类很想,OC中叫字典,Java中叫Map,还有字典是无序的,这个和NSArray不一样,Java中的Map也是无序的,通过hash值去检索元素的. 一.NSDictionary类 [objc] view plain copy // //  main.m //  19_NSDictionary // //  Created by jiangwei on 14-10-

java基础,继承类题目:编写一个Java应用程序,该程序包括3个类:Monkey类、People类和主类 E

21.编写一个Java应用程序,该程序包括3个类:Monkey类.People类和主类 E.要求: (1) Monkey类中有个构造方法:Monkey (String s),并且有个public void speak() 方法,在speak方法中输出“咿咿呀呀......”的信息. (2)People类是Monkey类的子类,在People类中重写方法speak(),在speak方法 中输出“小样的,不错嘛!会说话了!”的信息. (3)在People类中新增方法void think(),在thi

过滤A类、B类、C类地址_shell脚本

#!/bin/bash#过滤A类.B类.C类地址#过滤A类地址 -o 只显示符合的A类地址[1-126]read -p "input the file absolute path:" fileegrep -o "([0-9]|[1-9][0-9]|1[01][0-9]|12[0-6])\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\>" $file |sort -n|uniq -c|sort -k 2 -rn >A_ip#过滤B