热门标签 | 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


推荐阅读
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
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社区 版权所有