通过E-mail共享Java 对象(2)

分类: J2SE   出处:iocblog整理  更新时间:2008-07-29   添加到收藏  

    1使用import语句引入i/o包,包括序列化接口。
    2-5定义类中的成员变量,并指出该类实现了序列化接口。
    6-10提供一个简单的构造函数
    11一个空的构造函数。这个构造函数在重建序列化对象时使用。见以下的例子。
    12-20定义一个方法函数,它把对象写入一个已经打开了的objectoutputstream。这个方 法函数首先创建一个objectoutputstream对象,然后调用writeobject方法函数,最后在 函数返回前显式清空输出缓冲区。
    21-30定义一个方法函数,它从一个打开了的inputstream中读入一个bugreport对象。注 意,如果输入流中下一个对象和正在读入对象的类型不一致时,readobject()将会抛出一 个异常。
    使用bugreport对象相当简单。譬如我们想要创建一个新的bugreport对象并且把它存入 一个文件,我们会用到以下代码:
  1 import java.io.*;
  2 bugreport bug = new bugreport(1.0, "crashes when spell checker invoked", 2);
  3 fileoutputstream os = new fileoutputstream("mybug.test");
  4 bug.save(os);
    很简单,对吗?当然,一旦对象已经被序列化,没有人能阻止你继续操纵对象的状态。上一 个例子中包涵了一个在被写入磁盘时已经存在对象的拷贝。因此你必须要十分谨慎,以防 在对对象做出所有的修改之后没有序列化对象,从而丢失了对象的状态修改信息。
    以下是怎样恢复一个对象的拷贝:
  1 import java.io.*(www.iocblog.net 文章来源)
  2 fileinputstream fis = new fileinputstream("mybug.test");
  3 bugreport bug = new bugreport().restore(fis);
    这更简单!是不是java的功能越来越强大了?
    现在我们修改第二个例子的第3行,使对象被写入一个字节数组而不是一个文件:
  1 import java.io.*
  2 bugreport bug = new bugreport(1.0, "crashes when spell checker invoked", 2);
  3 字 节arrayoutputstream os = new 字 节arrayoutputstream();
  4 bug.save(os);
    好了,我们已经构造了一个对象,并且学会把它序列化后放入一个字节outputstream。然 后,我们将把这个字节outputstream转化为一个base64编码的字符串。
  
    .base64编码
    目前的internet e-mail标准--简单邮件传递协议(smtp)在rfc821中宣布。对于我们来说, rfc821对邮件的内容规定了两条重要但不难实现的限制。
    1.邮件的内容必须全部为7-比特的美国ascii码。
    2.每一行的长度不能超过1000的字符。
    因此为了通过smtp用e-mail进行传送,内存的序列化对象必须转化为和以上相容的格式。
    rfc1521提供了一个可行的方案。它定义了邮件的内容部分,使之能包涵多种形式的数 据。这种标准就是目前众所周知的mime。
    按照rfc1521编码过程为:输入是24个比特,输出是4个字节。24个比特输入组从左至右 由3个8比特的输入组形成。这24个比特被看成4个连续的6比特组,而每个6比特输入组被翻 译为base64码表中的一个数字。
    这意味着如果我们有下面的3个字节的输入--xc,xf3,xff--它将会被转化为如下 的base64的编码:x3,xf,xf,x3f。
    base64编码似乎有点神秘,但实现它的代码却非常简单,在下面的程序中我们可以看到 这一点。在这个例子中,我们创建了一个新类,codecs。现在,codecs有两个方法函数:一 个用来对字符数组编码,一个用来对string类编码。对string类编码的方法函数简单地调 用string类的getbytes()函数,然后对返回的结果字符数组进行编码。我们将增加从base6解 码至原先格式的方法函数。
  1 public class codecs {
  2 private codecs() {} // do not instantiate this class
  3 public final static string base64encode(string strinput) {
  4 if (strinput == null) return null;
  5 byte bytedata[] = new byte[strinput.length()];
  6 strinput.getbytes(0, strinput.length(), bytedata, 0);
  7 return new string(base64encode(bytedata), 0);
  8 }
  9 public final static byte[] base64encode(byte[] bytedata) {
  10 if (bytedata == null) return null;
  11 int isrcidx; // index into source (bytedata)
  12 int idestidx; // index into destination (bytedest)
  13 byte bytedest[] = new byte[((bytedata.length+2)/3)*4];
  14 for (isrcidx=0, idestidx=0; is(www.iocblog.net 文章来源)

上一页 [1] [2]



文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。