《java序列号流基础入门》由会员分享,可在线阅读,更多相关《java序列号流基础入门(18页珍藏版)》请在金锄头文库上搜索。
1、1 序列流SequneceInputStreamDemo.javapackage cn.itcast_06;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.SequenceInputStream;/* 以前的操作:* a.txt - b.txt* c.txt - d.txt* * 现在想要:* a.txt+b.
2、txt - c.txt*/public class SequenceInputStreamDemo public static void main(String args) throws IOException / SequenceInputStream(InputStream s1, InputStream s2)/ 需求:把 ByteArrayStreamDemo.java 和 DataStreamDemo.java 的内容复制到 Copy.java 中InputStream s1 = new FileInputStream(ByteArrayStreamDemo.java);InputS
3、tream s2 = new FileInputStream(DataStreamDemo.java);SequenceInputStream sis = new SequenceInputStream(s1, s2);BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(Copy.java);/ 如何写读写呢,其实很简单,你就按照以前怎么读写,现在还是怎么读写byte bys = new byte1024;int len = 0;while (len = sis.read(bys) != -1) bo
4、s.write(bys, 0, len);bos.close();sis.close();SequneceInputStreamDemo2.javapackage cn.itcast_06;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.SequenceInputStream;import java.util.
5、Enumeration;import java.util.Vector;/* 以前的操作:* a.txt - b.txt* c.txt - d.txt* e.txt - f.txt * * 现在想要:* a.txt+b.txt+c.txt - d.txt*/public class SequenceInputStreamDemo2 public static void main(String args) throws IOException / 需求:把下面的三个文件的内容复制到 Copy.java 中/ ByteArrayStreamDemo.java,CopyFileDemo.java,D
6、ataStreamDemo.java/ SequenceInputStream(Enumeration e)/ 通过简单的回顾我们知道了 Enumeration 是 Vector 中的一个方法的返回值类型。/ Enumeration elements()Vector v = new Vector();InputStream s1 = new FileInputStream(ByteArrayStreamDemo.java);InputStream s2 = new FileInputStream(CopyFileDemo.java);InputStream s3 = new FileInput
7、Stream(DataStreamDemo.java);v.add(s1);v.add(s2);v.add(s3);Enumeration en = v.elements();SequenceInputStream sis = new SequenceInputStream(en);BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(Copy.java);/ 如何写读写呢,其实很简单,你就按照以前怎么读写,现在还是怎么读写byte bys = new byte1024;int len = 0;whil
8、e (len = sis.read(bys) != -1) bos.write(bys, 0, len);bos.close();sis.close();3 序列化流ObjectSteamDemo.javapackage cn.itcast_07;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;/* 序列化流:把对象按照流一样的方式
9、存入文本文件或者在网络中传输。对象 - 流数据(ObjectOutputStream)* 反序列化流:把文本文件中的流对象数据或者网络中的流对象数据还原成对象。流数据 - 对象(ObjectInputStream)*/public class ObjectStreamDemo public static void main(String args) throws IOException,ClassNotFoundException / 由于我们要对对象进行序列化,所以我们先自定义一个类/ 序列化数据其实就是把对象写到文本文件/ write();read();private static voi
10、d read() throws IOException, ClassNotFoundException / 创建反序列化对象ObjectInputStream ois = new ObjectInputStream(new FileInputStream(oos.txt);/ 还原对象Object obj = ois.readObject();/ 释放资源ois.close();/ 输出对象System.out.println(obj);private static void write() throws IOException / 创建序列化流对象ObjectOutputStream oos
11、 = new ObjectOutputStream(new FileOutputStream(oos.txt);/ 创建对象Person p = new Person(林青霞, 27);/ public final void writeObject(Object obj)oos.writeObject(p);/ 释放资源oos.close();Person,javapackage cn.itcast_07;import java.io.Serializable;/* NotSerializableException:未序列化异常* * 类通过实现 java.io.Serializable 接口
12、以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。* 该接口居然没有任何方法,类似于这种没有方法的接口被称为标记接口。* * java.io.InvalidClassException: * cn.itcast_07.Person; local class incompatible: * stream classdesc serialVersionUID = -2071565876962058344, * local class serialVersionUID = -8345153069362641443* * 为什么会有问题呢?* Person类实现了序列化接口,那么
13、它本身也应该有一个标记值。* 这个标记值假设是100。* 开始的时候:* Person.class - id=100* wirte数据: oos.txt - id=100* read数据: oos.txt - id=100* * 现在:* Person.class - id=200* wirte数据: oos.txt - id=100* read数据: oos.txt - id=100* 我们在实际开发中,可能还需要使用以前写过的数据,不能重新写入。怎么办呢?* 回想一下原因是因为它们的id 值不匹配。* 每次修改java文件的内容的时候,class文件的id值都会发生改变。 * 而读取文件的
14、时候,会和class 文件中的id 值进行匹配。所以,就会出问题。* 但是呢,如果我有办法,让这个id 值在java文件中是一个固定的值,这样,你修改文件的时候,这个id值还会发生改变吗?* 不会。现在的关键是我如何能够知道这个id 值如何表示的呢?* 不用担心,你不用记住,也没关系,点击鼠标即可。* 你难道没有看到黄色警告线吗?* * 我们要知道的是:* 看到类实现了序列化接口的时候,要想解决黄色警告线问题,就可以自动产生一个序列化id值。* 而且产生这个值以后,我们对类进行任何改动,它读取以前的数据是没有问题的。* * 注意:* 我一个类中可能有很多的成员变量,有些我不想进行序列化。请问该
15、怎么办呢?* 使用transient关键字声明不需要序列化的成员变量*/public class Person implements Serializable private static final long serialVersionUID = -2071565876962058344L;private String name;/ private int age;private transient int age;/ int age;public Person() super();public Person(String name, int age) super();this.name =
16、 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;Overridepublic String toString() return Person name= + name + , age= + age + ;7 猜数字小游戏GuessNumber.javapackage cn.itcast_08;import java.util.Scanner;/* 这