关闭

java编程思想阅读笔记(十)I/O系统(下)

标签: 编程javauserconstructorstringnull
1239人阅读 评论(1) 收藏 举报
分类:
    补充下对象序列化的相关内容。至于XML读写之类的就不写了,无非也就是按照规定方式读写的东西。
    对象的序列化将那些实现了Serializable(Externalizable)接口的对象转换成一个字节序列,并能在以后将这字节序列完全恢复为原来的对象;说得白话些就是将对象相关的信息保存起来(可以写到文件里,或者远程发送出去),在需要的时候把这些保存的信息再恢复出来形成对象;这里就会有下面一些问题:
    1.保存了完整的对象信息了吗?
    对象的序列化的字节序列中,保存了对象的数据成员(属性),同时也包括了其成员所引用的信息;在恢复过程中不需要调用任何构造器;那么经过远程传输为什么却不可以直接恢复,原因是需要用到起class对象信息,看一下简单的用法:
    ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream(""));
    out.writeObject(duixiang);

    ObjectInputStream in = new ObjectInputStream( new FileInputStream(""));
    (类型)in.readObject();
    这是一个简单的将对象序列化到文件中,然后读取文件再恢复的过程;不难理解如果是不同程序之间对象的恢复,至少得有这个对象的类型信息啊。
    2.有些成员不想保存当前信息
    对于序列化的控制,可以使用Externalizable接口,通过writeExternal()  readExternal()方法来做。这个在序列化时通过将当前信息在writeExterna方法中保存想要保存的信息,恢复时,调用默认的构造器之后,通过readExternal方法将保存的信息恢复出来。这里就看到与实现Serializable接口的区别,一个不需要调用任何的构造器,一个调用默认的构造器。
    那么如果想用到Serializable的自动化,又不想保存部分成员信息呢,可以使用transient关键字:
    private transient string password;
    3.对于引用的分歧
    如果序列化多个对象,而都引用了一个对象,那么这个对象在恢复的时候是有不同的副本还是只有一个存储地址?通过下面的例子可以看到:
package com.test.myjava;

//主要演示了Serializable接口以及transient关键字
import java.io.*;
class Information implements Serializable{}
public class SerializableTest implements Serializable{
	private int id;
	private transient String password;
	private String name;
	private Information otherInformation;
	public SerializableTest(int i,String p,String n,Information f){
		System.out.println("Constructor:"+n);
		id = i;
		password = p;
		name = n;
		otherInformation = f;
	}
	public String toString(){
		return "id:"+id +" name:"+name +" pasword:"+password //密码没有保存,为null
		          +" friendName:"+otherInformation;//otherInformation.hashCode() 
	}
	public static void main(String[] args ) throws IOException,ClassNotFoundException{
		Information allFriendName = new Information();

		SerializableTest user1 = new SerializableTest(1,"1","user1",allFriendName);
		SerializableTest user2 = new SerializableTest(2,"2","user2",allFriendName);
		SerializableTest user3 = new SerializableTest(3,"3","user3",allFriendName);
		
		System.out.println("Start\n");
		System.out.println(user1.toString());
		System.out.println(user2.toString());
		System.out.println(user3.toString());
		//序列化
		ByteArrayOutputStream buf1 = new ByteArrayOutputStream();
		ObjectOutputStream out1 = new ObjectOutputStream(buf1);
		out1.writeObject(user1);
		out1.writeObject(user2);
		
		ByteArrayOutputStream buf2 = new ByteArrayOutputStream();
		ObjectOutputStream out2 = new ObjectOutputStream(buf2);
		out2.writeObject(user3);
		//恢复
		ObjectInputStream in1 = new ObjectInputStream(
				new ByteArrayInputStream(buf1.toByteArray()));
		ObjectInputStream in2 = new ObjectInputStream(
				new ByteArrayInputStream(buf2.toByteArray()));
		user1 = (SerializableTest)in1.readObject();
		user2 = (SerializableTest)in1.readObject();
		user3 = (SerializableTest)in2.readObject();
		
		System.out.println("Then\n");
		System.out.println(user1.toString());
		System.out.println(user2.toString());
		System.out.println(user3.toString());

	}
}

输出结果:

Constructor:user1
Constructor:user2
Constructor:user3
Start

id:1 name:user1 pasword:1 friendName:com.test.myjava.Information@c17164
id:2 name:user2 pasword:2 friendName:com.test.myjava.Information@c17164
id:3 name:user3 pasword:3 friendName:com.test.myjava.Information@c17164
Then

id:1 name:user1 pasword:null friendName:com.test.myjava.Information@19b49e6
id:2 name:user2 pasword:null friendName:com.test.myjava.Information@19b49e6
id:3 name:user3 pasword:null friendName:com.test.myjava.Information@10d448

    对于写到一个流中的引用,确实都指向一个地址,而对于不同的流则有不同的副本。
1
0
查看评论

Java编程思想 第十八章 Java I/O系统

java编程思想 第十八章 Java I/O系统 包括内容:File类,输入和输出,添加属性和有用的接口,Reader和Writer,RandomAccessFile,I/O流的典型使用方式(缓冲输入文件,从内存输入,格式化的内存输入,基本的文件输出,存储和恢复数据,读写随机访问文件),文件读写的实...
  • liuyesuifen
  • liuyesuifen
  • 2016-10-08 20:51
  • 511

《java编程思想》第十八章 java I/O系统

对程序语言来说,创建一个好的输入/ 输出(I/O)系统是一项艰难的任务。
  • fromatozhappy
  • fromatozhappy
  • 2016-09-19 17:10
  • 163

java编程思想-第18章-java I/O系统

第18章:java I/O 系统18.1 File表面上看File指的是一个文件,实际上FIle既可以表示一个文件也可以表示很多文件的集合,用目录来解释File比较合适。18.1.1 目录列表器File path = new File(“,”); String list = path.list()...
  • KJDynasty
  • KJDynasty
  • 2017-03-18 17:15
  • 421

Java编程思想-IO系统

一、输入和输出编程语言的I/O类库中常使用流这个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象。“流”屏蔽了实际的I/O设备中处理数据的细节。Java类库中的I/O类分成输入和输出两部分。通过继承,任何自Inputstream或Reader派生而来的类都含有名为rea...
  • nuaazhaofeng
  • nuaazhaofeng
  • 2016-12-10 22:06
  • 427

《java编程思想》第十八章 java I/O系统

1,对程序语言设计者来说,创建一个好的输入/输出(I/O)系统是一项艰难的事。   2,File类:     它是能代表一个特定的文件的名称,又能代表一个目录下的一组文件的名称。如果它代表一个文件集,我们就可以对此集合调用list()方法,这...
  • fromatozhappy
  • fromatozhappy
  • 2016-10-07 21:07
  • 154

java编程思想读书笔记 第十八章 java I/O系统(第一篇)

1. File类 File(文件)类这个名字有一定的误导性;我们可能会认为它指代的是文件,实际上却并非如此。塔既能代表一个特定文件的名称,又能代表一个目录下的一组文件的名称。如果它指的是一个文件集,我们就可以对此集合调用list()方法,这个方法会返回一个字符数组。我们很容易就可以理解返回的是一个...
  • abc709272013
  • abc709272013
  • 2016-10-30 20:21
  • 183

Java编程思想读书笔记(一)第1~13、16章

目录: Java编程思想(一)第1~13、16章 Java编程思想(二)第14章-类型信息 Java编程思想(三)第15章-泛型 Java编程思想(四)第17章-容器深入研究 Java编程思想(五)第18章-Java IO系统 Java编程思想(六)第19章-枚举类型 Java编程思想...
  • leonliu06
  • leonliu06
  • 2017-11-26 18:54
  • 713

java编程思想阅读笔记(十)I/O系统(上)

又是好久没有更新了,在外面出差,还参加了个Nice公司的亚太区销售峰会,体会了些软件卖钱的理念,然后就是公司搞得气派与自己英文的太烂了。最后说书,这个书其实第一遍算是看个差不多了,慢慢的在把笔记补上,还是原来的话,仅仅看语法和体会一些用到的细节了,至于思想还是感受不到,没有真正的大的项目还是无法支撑...
  • w7849516230
  • w7849516230
  • 2012-03-26 22:32
  • 1218

JAVA编程思想第4版读书笔记

原来download了网上一个第1版的Java编程思想,里面讲的还是Java1.0和Java1.1时代的故事。我看到一半,又找到第三版,发现讲的是Java 1.4时代的故事。到第4版,讲Java 1.6。我想现在都到Java 1.8了,这两年该出Java编程思想第5版了吧! 这件事情给我的教训是,看...
  • androidTang
  • androidTang
  • 2015-10-01 11:30
  • 781

Java编程思想--I/O系统

1,File类 既能代表一个特定文件的名称,又能代表一个目录下的一组文件的名称。如果它指向的是一个文件集,可以对词集合调用list()方法,返回一个字符数组。 例1 package FileTest; import java.io.File; public class DirList { ...
  • lskyne
  • lskyne
  • 2013-06-06 11:23
  • 942
    个人资料
    • 访问:551938次
    • 积分:6193
    • 等级:
    • 排名:第4761名
    • 原创:91篇
    • 转载:0篇
    • 译文:2篇
    • 评论:244条
    一起讨论学习

    欢迎关注微信公众号“编程阳光”

    微信扫一扫上方二维码即可关注

    最新评论