感悟

这周做东西的时候收获了不少东西。踩了不少的坑,分享一下这些坑,让大家以后别像我一样掉坑里了。

关于java读取properties的问题。

这个问题是在开发日志收集预警统计的时候遇到的,因为这个些问题开发过程中产生了不少问题。

问题描述:java读取properties中的时候使用流的时候默认中文是乱码

产生原因:看了一下源码,读取的时候不设置流的话默认会以char来读取。而properties文件会有2中情况。
1.使用的时候会采用转码格式使用,即ascii码以及unicode转义码。
2.直接类似文件操作。

解决办法:根据Java自带的类java.util.Properties来看使用第一种是比较好的方式,这样就会避免中午乱码的可能。
第二种方式只有针对流进行二次封装了。设置好流的读取编码,这样也可以避免乱码问题。

这2种方式各有优缺点。第一种贴近规范,但是配置的中文不直观。第二种中文直观了,但是不是规范的做法。

问题描述:java保存properties的时候文档追加问题。

产生原因:properties的保存类型是Hashtable,java.util.Properties提供的store方式是把所有Hashtable数据按照Properties格式写入流中。
于是采用properties写数据的时候写完一次,必须保证流的关闭。这样下次流再写的时候就能覆盖。(流默认从头开始写入,就是覆盖写入)。

解决办法:tasks运行1次关闭一次流。

问题描述:windows上进行文件操作只是单向的。即文件只要有人操作,这个文件就会被上锁。上锁后你不能写入。

产生原因:和操作系统有关。

解决办法:没办法换linux上整。

关于jstl数字格式化问题

在写教室使用统计的时候遇见。我需要根据时长了格式化显示时间。

问题描述:例如:90000毫秒,我需要格式化成“0小时1分30秒”。

产生原因:jstl 提供了数字的格式化,简单计算后格式显示,本来认为这样可以。但是发现格式化数据的时候jstl的fmt并不支持像“全舍”,“全入”,“4舍5入”等的功能,他本来提供的舍入功能也很奇葩。
默认是“四舍六入五奇偶”,最后一位小数是5的时候,当前一位是奇数的时候就进一位凑成偶数,当前一位是偶数的时候就舍去。例如:4.45就是4.4 ;4.55就是4.6。

解决办法:采用数学的方式解决。网上一收解决方式提供了+或者-0.5或者+0.000001等的一个数来满足“全舍”,“全入”,“4舍5入”等的功能。我采用该种方式进行测试发现完全是坑爹,这样的方式不通用。
当一个数小于0.5或者更小的时候,就会产生复数。然后就有-0的出现。而是复数更是满足不了要求。所以这样的方法我放弃了。然后我使用了取余的方式。如下:
Floor(N) -> ${N-(N%1)}
Ceiling(N) -> ${N+(1-(N%1))%1}
Round(N) -> ${N+((N%1>0.5)?(1-(N%1))%1:-(N%1))}

关于gradle问题

在写模块话时候遇见。

问题描述:当你打包一个模块上传到maven仓库的时候,依赖于这个模块的项目依赖会很奇怪。有时候会少一些依赖。有时候会多一些依赖

产生原因:与gradle的cache有关,cache与本地仓库冲突。

解决办法:清除gradle的cache。(用户目录的)

关于hql

问题描述:分页中出现了重复数据。

产生原因:两表关联没有注意限制条件,在hql中默认的inner join太坑爹,当没有使用关系查询的时候聊胜于无。

解决办法:直接上原始的jdbc。