1、介绍下Java中的IO流
IO(Input Output)用于实现对数据的输入和输出操作,Java把不同的输入/输出源(键盘、文件、网络等)抽象表述为流(Stream)。流是从起源到接收的有序数据,有了它就可以用同一种方式访问不同的输入/输出源。
分类:
1)按照数据流向:分为输入流和输出流。输入流只读不写,输出流只写不读。
2)按照数据类型:分为字节流和字符流。字节流操作8位的字节,字符流操作16位的字符。
3)按照处理功能:分为节点流和处理流。节点流可以从/向一个特定的IO设备输入/输出数据,也称低级流;处理流是对节点流的连接或封装,简化数据读写功能提高性能,也称高级流。
常用类:
Java提供了大量的类来支持IO操作,下表给大家整理了其中比较常用的一些类。其中,黑色字体的是抽象基类,其他所有的类都继承自它们。红色字体的是节点流,蓝色字体的是处理流。
根据命名很容易理解各个流的作用:
  • 以File开头的文件流用于访问文件;
  • 以ByteArray/CharArray开头的流用于访问内存中的数组;
  • 以Piped开头的管道流用于访问管道,实现进程之间的通信;
  • 以String开头的流用于访问内存中的字符串;
  • 以Buffered开头的缓冲流,用于在读写数据时对数据进行缓存,以减少IO次数;
  • InputStreamReader、InputStreamWriter是转换流,用于将字节流转换为字符流;
  • 以Object开头的流是对象流,用于实现对象的序列化;
  • 以Print开头的流是打印流,用于简化打印操作;
  • 以Pushback开头的流是推回输入流,用于将已读入的数据推回到缓冲区,从而实现再次读取;
  • 以Data开头的流是特殊流,用于读写Java基本类型的数据。
 
2、怎么用流打开一个大文件
打开大文件应采用分次读取的方式。
1. 使用缓冲流。缓冲流内部维护了一个缓冲区,通过缓冲区的交互,减少与设备交互的次数。
2. 使用NIO。NIO采用映射文件的方式来处理输入/输出。NIO将文件的一段区域映射到内存中,这样就可以像访问内存一样访问文件了。
 
3、NIO的实现原理
Java的NIO主要由三个核心部分组成:Channel、Buffer、Selector。
Channel:基本上,所有的IO在NIO中都是从Channel开始的。数据可以从Channel读到Buffer中, 也可以从Buffer写到Channel中。
Buffer:本质是一个可读写的数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用于方便的访问该块内存。
Buffer对象包含三个重要属性:capacity、position、limit,即容量、当前位置、可用空间
Selector:用于处理多个Channel,当打开了多个连接(通道),但每个连接的流量都很低,使用selector会很方便。
 
4、Java的序列化和反序列化
序列化机制可以将对象转化为字节序列,这些字节序列(Serialize)可以保存在磁盘上,可以用于网络传输,并允许程序将这些字节序列再次恢复成原来的对象即反序列化(Deserialize)。若要实现序列化,则需要使用对象流ObjectInputStream和ObjectOutputStream。
 
5、Serializable接口为什么要定义serialVersionUID变量
serialVersionUID代表序列化版本,通过定义类的序列化版本,在反序列化时,只要对象中所存的版本和当前版本一样,就允许做数据恢复操作,否则就有抛出版本不一致的异常。
 
6、除了Java自带的序列化工具,还有哪些
1. JSON:简单直观,可读性好,有jackjson、gjson、fastjson;
2. Protobuf:用来序列化结构化数据的技术,支持多语言,可以使用该技术来持久化数据或化成网络传输的数据;优点:节省空间(二进制流存储),缺点:支持的数据类型相对较少,不支持常量
3. Thrift:是FaceBook开源提供的一个高性能,轻量级RPC服务框架,解决大数据量、分布式、跨语言、跨平台的数据通讯需求。
 
7、如果不用JSON工具,该如何实现对实体类的序列化?
1. 使用Java原生态的序列化机制,但是效率较低,适合小项目
2. 使用其他第三方库,Protobuf、Thrift、Avro等
 
 
 
 posted on 2022-06-06 09:37  Slothhh  阅读(72)  评论(0编辑  收藏  举报