Java-I/O流

本文借鉴于JavaGuide,用于学习记录

I/O流

什么是序列化?什么是反序列化?

如果我们需要持久化Java对象比如将 Java 对象保存在文件中,或者在网络传输 Java 对象,这些场景都需要用到序列化。

简单来说:

  • 序列化:将数据结构或对象转换成二进制字节流的过程
  • 反序列化:将在序列化过程中所生成的二进制字节流转换成数据结构或者对象的过程

对于 Java 这种面向对象编程语言来说,我们序列化的都是对象(Object)也就是实例化后的类(Class),但是在C++中这种半面向对象语言中,struct(结构体)定义的是数据结构类型,而class对应的是对象类型。

序列化的主要目的是通过网络传输对象或者说是将对象存储到文件系统、数据库、内存中。

Java序列化中如果有些自担不想进行序列化,怎么办?

对于不想进行序列化的变量,使用transient关键字修饰。

ttansient关键字的作用是:阻止实例中那些用此关键字修饰的变量序列化;当对象被反序列化时,被ttansient修饰的变量值不会被持久化和恢复。

关于ttansient还有几点注意:

  • ttansient只能修饰变量,不能修饰类和方法。
  • ttansient修饰的变量,在反序列化后变量值将会被置成类型的默认值。例如,如果是修饰int类型,那么反序列后结果就是0
  • Static变量因为不属于任何对象(Object),所以无论有没有ttansient关键字修饰,均不会被序列化

获取用键盘输入常用的两种方法

方法 1:通过 Scanner

Scanner input = new Scanner(System.in);
String s  = input.nextLine();
input.close();

方法 2:通过 BufferedReader

BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
String s = input.readLine();

Java中IO流分为几类

  • 按照流的流向分,可以分为输入流和输出流
  • 按照操作单元划分,可以分为字节流和字符流
  • 按照流的角色划分为节点流和处理流

Java IO流共涉及40多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在非常紧密的联系,JavaIO流的40多类都是从如下4个抽象类中派生出来的

  • InputStream/Reader:所有的输入流的基类,前者是字节输入流,后者是字符输入流
  • OutputStream/Writer:所有输出流的基类,前者是字节输出流,后者是字符输出流

既然有了字节流,为什么还要有字符流?

问题本质想问:不管是文件读写还是网络发送接收,信息的最小存储单元都是字节,那为什么 I/O 流操作要分为字节流操作和字符流操作呢?

回答:字符流是由 Java 虚拟机将字节转换得到的,问题就出在这个过程还算是非常耗时,并且,如果我们不知道编码类型就很容易出现乱码问题。所以, I/O 流就干脆提供了一个直接操作字符的接口,方便我们平时对字符进行流操作。如果音频文件、图片等媒体文件用字节流比较好,如果涉及到字符的话使用字符流比较好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值