1 问题描述
今天编程的时候遇到一个问题 先前用MATLAB生成了一个数据文件 使用MATLAB的原因是MATLAB能够很快地对算法进行实现 效率较高 但是这个数据文件需要在Android程序中使用 也就是说 需要用Java读取文件中的数据 对我而言 我感觉这是一个比较复杂的问题 还是需要记录一下2 致谢
感谢网友Defonds提供的资料 链接如下:/defonds/article/details/87827853 解决方案
3.1 明确文件的编码方式
对于文件的读写操作来说 首先需要明确的就是文件的编码方式 常见的编码格式有两种文本格式和二进制格式首先需要明确所操作的文件是什么格式 由于我的文件是在MATLAB中用fwrite()函数生成的fwrite()的作用是向二进制文件中写入数据 所以这里我们的编码格式是二进制格式3.2 明确小端模式和大端模式
这里的小端模式和大端模式指的是 数据中高低字节的存放模式大端模式:低字节存放在高地址位小端模式:低字节存放在低地址位 我们使用的是Windows系统 经测试 使用的是小端模式3.3 明确数据类型的字节数
基本的数据类型有double int long 这几种 关于不同编程语言基本类型字节数的信息可以在百度上查到 这里就不赘述了 举例说明 这里我们使用的是int型 int型在MATLAB和Java中都是4字节 也就是32位3.4* 基本函数的使用
这里当时出现了一个问题,我当时想, 是否能直接使用DataInputStream类的readInt()函数直接进行读取呢,回答是不行的, 我当时尝试了一下,读出来的结果很奇怪, 经过测试 我发现:DataInputStream类的readInt()函数默认是大端编码的而这里我在写入文件时 使用的是小端编码 所以不能直接使用Java提供的库函数
3.4 编程实现
我们再来明确一下我们的问题: 现有一个二进制文件,存储有以小端模式存储的int整数型数据。 我们需要用文件流的形式将其读出,具体来说就是byte[]数组的形式读取出来, 也就是说,需要将byte[]数组转换为int型数据。 基本的算法思想可以参考我的一篇博客:/songyuc/article/details/51013325 这里我再进行一下说明 算法的思想如下: 1.用“& 0xFF”进行“位清理” (注意位清理的时候0xFF同样需要进行相应的移位操作 具体的实现可以参考我的“代码实现”)2.根据大端小端模式,使用“<<”运算将字节移动到相应的位置; 3.用“|”操作进行合并 4.重复上述过程
具体代码实现如下:
private final static int INT_SIZE = 4;private static int readInt(DataInputStream dis) {byte bytes[] = new byte[INT_SIZE];try {dis.read(bytes, 0, INT_SIZE);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return bytes2Int(bytes);}
如果觉得《在Java中如何读取用MATLAB的fwrite()函数写入文件的数据》对你有帮助,请点赞、收藏,并留下你的观点哦!