本文共 1538 字,大约阅读时间需要 5 分钟。
读取文件,要保证文件中的字符集和字符流的字符集是一致的,否则就会出现乱码;
警惕文件操作,可能因为读取文件过大,都放入内存,导致 oom;
使用流操作,一定记得关闭,报错 too many files,可能是大量文件流未关闭;
读写文件,考虑设置缓冲区,即一次性读取一大块数据到缓冲区,后续的读取就可以从缓冲区返回数据,不用每次都操作 io,可以自己创建缓冲区 byte[],或者使用 bufferedxxxStream,千万不要单字节读写,因为这样每个字节操作,都需要 io 操作;
如果是类似文件复制操作的需求,希望有更高性能,可以使用 FileChannel 的 transfreTo 方法进行流的复制;
序列化,对象转换成字节流的过程,常用的序列化算法,有 JDK 序列化,XML 序列化,JSON 序列化,protobuf 序列化,
其中 JDK 序列化无法跨语言,XML 序列化性能较差,JSON 和 protobuf 使用较广泛;要保证序列化和反序列化算法一致,以 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; }
转载地址:http://fsfin.baihongyu.com/