博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
每日一学:IO 操作,序列化
阅读量:3731 次
发布时间:2019-05-22

本文共 1538 字,大约阅读时间需要 5 分钟。

io 操作要点

  1. 读取文件,要保证文件中的字符集和字符流的字符集是一致的,否则就会出现乱码;

  2. 警惕文件操作,可能因为读取文件过大,都放入内存,导致 oom;

  3. 使用流操作,一定记得关闭,报错 too many files,可能是大量文件流未关闭;

  4. 读写文件,考虑设置缓冲区,即一次性读取一大块数据到缓冲区,后续的读取就可以从缓冲区返回数据,不用每次都操作 io,可以自己创建缓冲区 byte[],或者使用 bufferedxxxStream,千万不要单字节读写,因为这样每个字节操作,都需要 io 操作;

  5. 如果是类似文件复制操作的需求,希望有更高性能,可以使用 FileChannel 的 transfreTo 方法进行流的复制;

序列化

  1. 序列化,对象转换成字节流的过程,常用的序列化算法,有 JDK 序列化,XML 序列化,JSON 序列化,protobuf 序列化,

    其中 JDK 序列化无法跨语言,XML 序列化性能较差,JSON 和 protobuf 使用较广泛;

  2. 要保证序列化和反序列化算法一致,以 redis 的存取为例,RedisTemplate 默认对 key 和 value 使用的都是 jdk 序列化,而 StringRedisTemplate 默认对 key 和 value 使用的都是 StringRedisSerialize 的序列化方式,因此默认两者不能同时使用,需要改变序列化算法来通用;

redisTemplate.opsForValue().set("jdkSerial-key", "jdkSerial-value");    在 redis 中,存储是 "\xac\xed\x00\x05t\x00\rjdkSerial-key" 和 "\xac\xed\x00\x05t\x00\x0fjdkSerial-value"    如果使用 StringRedisTemplate 来读,stringRedisTemplate.opsForValue().get("jdkSerial-key"),读到就是 null;    如果想要读到值,需要改变 stringRedisTemplate 的 key 和 value 的序列化算法都为 jdkSerial		@Bean    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory){
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate(); stringRedisTemplate.setConnectionFactory(redisConnectionFactory); stringRedisTemplate.setKeySerializer(RedisSerializer.java()); stringRedisTemplate.setValueSerializer(RedisSerializer.java()); return stringRedisTemplate; }
  1. 推荐将 redisTemplate,stringRedisTemplate 的序列化算法都改为,key 使用 stringRedisSerialize 的方式,value 使用RedisSerializer.json() 的序列化方式,这样,取出的 key 是字符串类型,取出的 value,可以直接转换成对象;

转载地址:http://fsfin.baihongyu.com/

你可能感兴趣的文章
keil5如何开启代码自动补全及如何加快编译速度
查看>>
2019年全国电子设计大赛D题《简易电路特性测试仪》(四)终章之故障检测
查看>>
STM32CubeMX简介及下载安装
查看>>
STM32CubeMX(01)基于HAL库点亮LED
查看>>
STM32CubeMX(02)HAL库之定时器
查看>>
TypeError: compilation. templatesPlugin is not a function的解决
查看>>
纵表和横表的相互转换与自我理解
查看>>
微信企业微信应用开启API接收信息来读取用户发送内容
查看>>
springboot注解@NotNull,@NotBlank,@Valid自动判定空值
查看>>
Java解决对象转json中Long类型下的null被转换后变成默认值0
查看>>
MySQL中时间函数(史上最全的时间函数)
查看>>
用一个大集合存入20个随机数字,然后筛选其中的偶数元素,放到小集合当中。 要求使用自定义的方法来实现筛选。
查看>>
在0-33里面产生6个随机数放ArrayList并遍历
查看>>
向集合ArrayList当中存储基本类型数据,必须使用基本类型对应的“包装类”
查看>>
java字符串比较问题
查看>>
String当中与获取相关的常用方法
查看>>
定义一个方法,把数组{1,2,3}按照指定格式拼接成一个字符串。格式参照如下:[word1#word2#word3]。
查看>>
键盘输入一个字符串,并且统计其中各种字符出现的次数。 种类有:大写字母、小写字母、数字、其他
查看>>
子类父类局部变量重命名问题(this,super)
查看>>
重写与重载的区别
查看>>