一些关于Java平台无关性的事儿

2010-11-23 14:33 by hackerzhou

曾经以为Java就是write once run anywhere,在最近尝试将大二时候做的BBS挂站机放到Ubuntu上运行的时候却发现Java中依赖平台提供的信息的地方还是有的,直接导致了之前在windows下运行稳健的jar拷过去就死活不能正常运行。

导出了下runtime的数据发现问题的根源在于编码,BBS使用的是GB2312编码进行通信,中文Windows系统默认的编码为GBK,因为GB2312是GBK的子集,而Ubuntu下默认编码是UTF-8。

出问题的方法是String类的getBytes()方法,String类的构造方法new String(byte[] bytes)方法以及String类的contains(CharSequence s)方法,前两者都依赖平台默认的编码进行操作。

由于我处理挂站的逻辑是根据服务器返回的数据中的特征码来判定目前的状态并执行相关的操作。我会把服务器返回的bytes转成String并执行contains或者正则匹配的方法来判定当前的状态,因此,在中文windows下用new String(byte[] bytes)和contains能正确解析并判断BBS传输来的GB2312编码字符流,但是在Ubuntu下这样做就会出现乱码,因为系统尝试用UTF-8将byte数组转成String。真是一个好大的bug,只有在跨平台的时候才会显现出来,感叹自己当年钻研不够深啊。

总结出了一个教训:即使是Java这样平台无关的语言上开发,也要对其中一些隐式平台依赖的方法慎重的使用,使用不当就会导致我有违Java初衷的结果:write once debug anywhere。

本文基于 署名 2.5 中国大陆 许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 hackerzhou 并包含 原文链接
发表评论

本文有 3 条评论

  1. 10ss Jasmine
    2012-02-22 14:30

    拜求java版BBS挂站机源码><

发表评论