java进阶学习十之序列化和Scanner与PrintWriter类

Serializable接口是启用其序列化功能的接口。实现java.io.Serializable接口的类是可序列化的。没有实现此接口的类将不能使它们的任意状态被序列化或逆序列化。对象实现了Serializable接口才能在网络中穿行

序列化把对象转化为字节序列的过程称之为对象的序列化

反序列化:把字节序列转化为对象的过程,称之为反序列化

Java Serialize序列化机制缺点

  • 序列化数据结果比较大、传输效率比较低

  • 不能跨语言对接

Java Serialize序列化机制优点

  • 恰当的序列化协议不仅可以提高系统的通用性、强壮型、安全性、优化性能。同时还能让系统更加易于调试和扩展。

如何实现序列化

  • 实现Serializable接口 (implements Serializable)
  • 定义 serialVersionUID:保证可以在序列化后,去添加一个字段,或者方法,而不会影响到后期的还原,还原后的对象照样可以使用,而且还多了方法或者属性可以用。
  • ObjectOutputStream :表示把对象序列化成字节。
  • ObjectInputStream : 表示读取指定的字节数据转换成对象。

注意:

  1. 在java中,只要一个类实现了java.io.Serializable接口,那么它就可以被序列化
  2. 通过ObjectOutputStream和ObjectInputStream对对象进行序列化合反序列化操作
  3. 对象是否允许被反序列化,不仅仅是取决于对象的代码是否一致,同时还有一个重要的因素(UID)
  4. 序列化并不保存静态变量的状态,如果已经序列化到一个文本里,如果再去改变该对象中的静态属性,那么反序列化之后这个静态的值是改变值之后的值。
  5. 要想父类对象也参与序列化操作,那么必须要让父类也实现Serializable接口
  6. Transient关键字,主要是控制变量是否能够被序列化。如果没有被序列化的成员变量反序列化后,会被设置成初始值,比如String -> null
  7. 通过序列化操作实现深度克隆。
  8. 对同一个对象进行多次写入,打印出的第一次存储结果和第二次存储结果,只多了5(eg)个字节的引用关系。
    并不会导致文件累加

Scanner类

 Scanner类是一个封装非常完美的高级类。

  • 可以用于键盘录入(System.in)
  • 可以用于文件读取
  • 可以用于网络编程中的接收信息

构造方法:第二个参数可选

Scanner(InputStream source, String charsetName)

Scanner(File source, String charsetName)

常用方法:
boolean hasNextLine() // 判断是否还有下一行

boolean hasNext()    // 判断是否还有下一个单词  空格分开

boolean hasNextT   // T 为8中基本类型

String  nextLine()   //    每一个hasNext都有一个next
Scanner sc = new Scanner(new File("E:/test.txt"));
while(sc.hasNextLine()){
    String line = sc.nextLine();
    System.out.println(line);
}

PrintWriter类

 Printwriter类也是一个封装非常完美的高级类

  • 可以用于控制台的打印
  • 可以给文件写入信息
  • 可以用于网络编程中的发送信息

构造方法:第二个参数可省略

PrintWriter(File file, String csn) // 每次创建新文件,不能追加  csn 编码名 charSet name

PrintWriter(OutputStream out, boolean autoFlush)

PrintWriter(String fileName, String csn) // 同File

PrintWriter(Writer out, boolean autoFlush) // 同OutputStream
 OutputStream outStream = new FileOutputStream("E:/test.txt", true);
//追加模式,无则创建,有则追加
PrintWriter out = new PrintWriter(outStream,true);   // 自动刷新

常用方法:

void print(T t)   // T 为任意类型

void println(T t)  // 

void printf()   // 用法与C语言中的printf相同,格式更加繁琐

PrintWriter开启自动刷新:

  1. 输出的数据目的必须是流对象 OutputStream Writer
  2. 必须调用 print println format 中得到任意一个
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值