热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

18天Java学习---Java的对象序列化以及文件IO处理

1.对象的序列化就是保存对象的当前状态。2.保存对象的状态有两种主要的方式:1)对象序列化(将对象写入到文件,以后再反序列化,见后例)如果保存的数据用于Java程序内交互,则采用对象的序列化;
 

1.对象的序列化就是保存对象的当前状态。

2.保存对象的状态有两种主要的方式: 

1)  对象序列化(将对象写入到文件,以后再反序列化,见后例)

如果保存的数据用于Java程序内交互,则采用对象的序列化;

2)  写入文件(将对象写入到文本文件,注意,是文本文件)

如果保存的数据用于和其他非Java程序交互,则保存到文本文件。

3.对象如果需要序列化,则它所在的类必须要实现Serializable接口。

     如果某类是可序列化的,则它的子类自动地可以序列化。

4.对象序列化的步骤:

1) 创建文件输出流;

2) 创建对象输出流;

3) 写入对象状态;

4) 关闭对象输出流;

?
12345678910111213 //1.创建文件输出流 FileOutputStream fs =newFileOutputStream("OutputFile.file");      //2.创建对象输出流 ObjectOutputStream os =newObjectOutputStream(fs);  //3.写入对象状态 os.writeObject(characterOne);os.writeObject(characterTwo);os.writeObject(characterThree);  //4.关闭对象输出流 os.close();

对象写入文件的顺序为:

其中,ObjectOutputStream是把对象转换成字节流;FileOutputStream是把字节流写入文件。

5.序列化对象会把对象的所有属性保存,被对象的实例变量所引用的对象也会被序列化。

     如果某实例变量不能或不应该被序列化,则把这个变量标记为transient。将属性标记为transient后,对象序列化时会将该属性保存为null值。

6.对象解序列化的步骤:

1) 创建文件输入流;

2) 创建对象输入流;

3) 读出对象状态;

4) 转换对象类型(因为对象读出后为Object类型);

5) 关闭对象输入流;

?
123456789101112131415161718 //1.创建文件输入流,如果文件不存在,则程序抛出异常FileInputStream fs =newFileInputStream("OutputFile.file");  //2.创建对象输入流 ObjectInputStream oi =newObjectInputStream(fs);  //3.读出对象状态 Object One= oi.readObject();Object two = oi.readObject();Object three = oi.readObject();  //4.转换对象类型 GameCharacter elf = (GameCharacter) one;GameCharacter troll = (GameCharacter) two;GameCharacter magician = (GameCharacter) three;          //5.关闭对象输入流 oi.close();

对象写出的顺序为:

 

在对象读出到对象输入流后,JVM会尝试查找和加载对象的类,如果不成功则报异常。

7.对象被还原时,静态变量维持类中原本的样子,而不是存储时的样子。

8.将对象状态写入文件的步骤:(使用BufferedWriter)

?
123456 //先用缓冲区存放数据,然后链接到文件BufferedWriter writer =newBufferedWriter(newFileWriter(aFile));//写入数据 writer.write("blabla");//关闭 writer.close();

对象写入文件的顺序:

 

      使用缓冲区Writer的原因:如果直接使用FileWriter的话,写硬盘需要好多次,速度较慢(硬盘读写速度远远慢于内存读写速度)。使用了缓冲区Writer就可以先缓冲数据,然后一次性得写到硬盘文件中。

9.将对象从文件读出的步骤:(使用BufferedReader)

?
1234567891011 //FileReader是字符的连接到文本文件的串流FileReader fileReader =newFileReader(newFile("File.txt"));//使用BufferedReader链接到FileReader,使得接收更有效率BufferedReader reader =newBufferedReader(fileReader);  String line = null; //挨行打印出数据 while((line = reader.readLine())!=null){     System.out.println(line);}

  文件读出的过程中,使用BufferedReader去链接FileReader,使得接收更有效率。

---------------------------------------

以下是一个对象序列化,反序列化以及文件IO的例子,以后可以翻阅

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

class CashCheck implements Serializable

{

    privatestaticfinallongserialVersiOnUID= -8872155900725314694L;

  

    privateString cashCheckID;

  

    privateintcashAmout;

  

    publicCashCheck()

    {

    }

  

    publicString getCashCheckID()

    {

        returncashCheckID;

    }

  

    publicvoidsetCashCheckID(String cashCheckID)

    {

        this.cashCheckID = cashCheckID;

    }

  

    publicintgetCashAmout()

    {

        returncashAmout;

    }

  

    publicvoidsetCashAmout(intcashAmout)

    {

        this.cashAmout = cashAmout;

    }

}

  

public class SerializeDemo01

{

    publicstaticvoidmain(String[] args)

    {

        CashCheck check =newCashCheck();

        check.setCashAmout(10000);

        check.setCashCheckID("notifier");

  

        /*

         * 序列化对象

         */

        try

        {

            // 1.创建文件输出流,负责将字节写入文件

            FileOutputStream fs = new FileOutputStream(

                    new File(

                            "C:\\Documents and Settings\\Administrator\\桌面\\notifier.file"));

  

            // 2.创建对象输出流,负责将对象转为字节

            ObjectOutputStream os = new ObjectOutputStream(fs);

  

            // 3.写入对象

            os.writeObject(check);

  

            // 4.关闭对象输出流

            os.close();

        } catch (FileNotFoundException e)

        {

            e.printStackTrace();

        } catch (IOException e)

        {

            e.printStackTrace();

        }

  

        /*

         * 解序列化对象

         */

        try

        {

            // 1.创建文件输入流,负责将文件转为字节

            FileInputStream fi = new FileInputStream(

                    "C:\\Documents and Settings\\Administrator\\桌面\\notifier.file");

  

            // 2.创建对象输入流,负责将字节写入对象

            ObjectInputStream oi = new ObjectInputStream(fi);

  

            // 3.读出对象

            Object o1 = oi.readObject();

            if (o1 instanceof CashCheck)

            {

                CashCheck check1 = (CashCheck) o1;

                System.out.println(check1.getCashCheckID());

                System.out.println(check1.getCashAmout());

            }

  

            // 4.关闭对象输入流

            oi.close();

        } catch (FileNotFoundException e)

        {

            e.printStackTrace();

        } catch (IOException e)

        {

            e.printStackTrace();

        } catch (ClassNotFoundException e)

        {

            e.printStackTrace();

        }

  

        /*

         * 以文件的形式读出序列化文件,是乱码

         */

        try

        {

            FileReader fr =newFileReader(

                    newFile(

                            "C:\\Documents and Settings\\Administrator\\桌面\\notifier.file"));

            BufferedReader br =newBufferedReader(fr);

  

            String line =null;

            while((line = br.readLine()) !=null)

            {

                System.out.println(line);

            }

        }catch(FileNotFoundException e)

        {

            e.printStackTrace();

        }catch(IOException e)

        {

            e.printStackTrace();

        }

    }

}

 

有关Java自定义序列化问题,可以参考:Java序列化的机制和原理,以及自定义序列化问题

Java序列化再学习:java serializable


推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
author-avatar
Horizonfeng_121
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有