近期学JAVA的IO,想练习一下,于是找来一个BMP文件,做练习使用。但是程序第一次运行就出了问题,分配空间的时候出错,后来查了一下,发现读取的文件大小不对,再后来发现,连读入的头两个字符"BM"都不对,设置断点查了一下,原来是用的RandomAccessFile类的readShort,读取的2个字节顺序不一样。从网上搜了一下,发现时Big-Endian和Little-Endian的问题。下面的是网上查到的一些介绍:
Java二进制文件中的所有东西都以big-endian形式存在,高字节优先,这有时被称为网络顺序。这是一个好的消息,意味着如果你只使用 Java。所有文件在所有平台(Mac,PC,Solaris等)上按同样的方式进行处理。可以自由地交换二进制数据,以电子形式在Internet上, 或在软盘上,而无需考虑endian问题。存在的问题是当你与那些不是使用Java编写的程序交换数据文件时,会存在一些问题。因为这些程序使用的是 little-endian顺序,通常是在PC上使用的C语言。有些平台内部使用big-endian字节顺序(Mac,IBM390);有些平台使用 little-endian字节顺序(Intel)。Java对用户隐瞒了endian问题。
解决方式可以采用:
- 重写提供输入文件的输出程序。它可以直接输出big-endian字节流DataOutputStream或者字符DataOutputSream格式。
- 写一个独立的翻译程序,读和排列字节。可以用任何语言编写。
- 以字节形式读数据,并重新安排它们。
- 还有一种方式是自己编写函数进行数据格式的转化。
打开RandomAccessFile的源代码,发现数据处理的代码如下:
简单明了,一目了然,因此重写输入输出程序是最简单的方法。由于这里的readShort是final的,因此采用由RandomAccessFile派生的方法,建立的新类如下:
就是把原来的代码拷贝出来,然后把移位的变量换一下,就能轻松搞定。