JAVA之读取二进制文件
0 引言
最近老师让写一个程序,作为学习JAVA的练习。目的在于:将一个二进制文件中的数据读取出来,其中数据包括点的位置信息和压力值及状态。将这些数据画作图像的形式展示。
本小程序分为以下几部分:
(1)读取二进制文件;其中需要考虑二进制文件读出来的是十进制数,需要将二个字节合成一个short型,并转换为int型值。
(2)画图;根据读取到的点的信息,循环,如果状态是画,则将该点与上一点相连;
1 读取二进制文件
所有的输入流类都是抽象类InputStream或Reader的子类。本文主要使用其中的FilterInputStream子类中的DataInputStream和BufferedInputStream这两个子类。
1.1 DataInputStream
构造函数为:
DataInputStream(InputStream in)
Creates a DataInputStream that uses the specified underlying InputStream.
使用基础类InputStream构造DataInputStream
方法主要有,见下表
本文使用readFully(byte[] b)方法读取所有的字节信息。
代码示例如下:
DataInputStream dis = null;dis = new DataInputStream(new FileInputStream ("./test.txt"));byte []b = new byte [1024];dis.read(b);
文件的所有信息都会存储在定义的byte数组中。
1.2 BufferedInputStream
构造函数如下:
BufferedInputStream(InputStream in)
Creates a BufferedInputStream and saves its argument, the input stream in, for later use.
BufferedInputStream(InputStream in, int size)
Creates a BufferedInputStream with the specified buffer size, and saves its argument, the input stream in, for later use.
方法主要有,见下表
主要使用read(byte [], off, len)方法读取文件信息。方法available()返回文件的字节数;
示例代码如下:
BUfferedInputStream bis = null;bis = new BufferedInputStream(new fileInputStream("./test.txt"));int len = bis.available();
byte []b = new byte[len];bis.read(b, 0, len);
byte数组中将存放文件的所有信息。
1.3 处理数据
根据以上两种方法获取了数据,接下来将对数据转换成int型。
由于buff数组中存放的是一个字节一个字节的,故将两个字节组合即可。
代码如下:
int x = (buff[0] & 0xff) | (buff[1] & 0xff) << 8;
int y = (buff[2] & 0xff) | (buff[3] & 0xff) << 8;
以上是小端模式(低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节)的转换,大端(与小端相反)的话直接调换一下就行。
2 画图
采用Graphics2D进行画图,使用BufferedImage创建画,并通过方法getGraphics()返回2D图像。
// create a BufferedImage with the size of (width, height)BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// to draw strokes, we need a Graphics2D - correlated with BufferedImageGraphics2D graphics2D = (Graphics2D) bufferedImage.getGraphics();// set the background to be WHITEgraphics2D.setBackground(Color.WHITE);graphics2D.clearRect(0, 0, width, height);// set width and color for linesgraphics2D.setPaint(Color.BLACK);graphics2D.setStroke(new BasicStroke(3));
2.1 将所有点连接成线
判断该点的状态是否是画,及下一个点是否是画,然后再连线
int pos;boolean bDrawing = false;int xPrev=-1, yPrev=-1;for( pos = 4; pos + 7 <= nLength ; pos += 7){byte status = buffer[pos];int x = ((buffer[pos+1]&0xff) | ((buffer[pos+2]&0xff) << 8)) / 10;int y = ((buffer[pos+3]&0xff) | ((buffer[pos+4]&0xff) << 8)) / 10;if( bDrawing ) {if(status == 0x11) {graphics2D.drawLine(xPrev, yPrev, x, y);xPrev = x;yPrev = y;}else {bDrawing = false;}}else {if(status == 0x11) {bDrawing = true;xPrev = x;yPrev = y;}else {// floating}}}
3 结果
4 总结
任重而道远,老师还是最牛逼的!
JAVA之读取二进制文件相关推荐
- java读二进制bin文件内容_利用Java读取二进制文件示例详细解说
前言 此文主要给大伙介绍了关于Java读取二进制文件的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 读Hex写CSV data目录下有little-endian bin文 ...
- Day1 Java读取二进制文件
任务:练习Java读取二进制文件,读取文件的前64和最后64个字节. 推荐一个十六进制在线编辑器:HexEd.it - Browser-based Online and Offline Hex Ed. ...
- java怎么读取二进制_Java如何实现读取二进制文件
Java如何实现读取二进制文件 发布时间:2020-11-10 16:19:46 来源:亿速云 阅读:83 作者:Leah 这篇文章运用简单易懂的例子给大家介绍Java如何实现读取二进制文件,内容非常 ...
- java读取二进制文件数据
java读取二进制文件数据 1.读取文件信息 java提供多种读取方式: /*** 按字节读取文件数据* @param fileName 文件路径包括文件名*/public static void r ...
- java 遍历二进制_读取二进制文件并循环遍历每个字节
在Python中读取二进制文件并循环遍历每个字节 Python 3.5中的新功能是 pathlib 模块,它有一个特别方便的方法来读取文件中的字节,允许我们迭代字节 . 我认为这是一个体面的(如果快速 ...
- c语言fread无法存储,【求助】C语言fread读取二进制文件时,读取结果全都是零
C语言fread读取二进制文件时,读取结果全都是零,编译运行都没问题,但是就是结果显示不对,猜想可能有几个原因: 1. 大小端没处理好,设置了程序判断机器为little endian,但是,身为小白的 ...
- Java多线程读取本地照片为二进制流,并根据系统核数动态确定线程数
Java多线程读取图片内容并返回 1. ExecutorService线程池 2. 效率截图 3. 源码 1. ExecutorService线程池 ExecutorService线程池,并可根据系统 ...
- java中读取properties文件内容五种方式
一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题.就借此机会把Spring+SpringMVC ...
- 怎么读取java文件,Java怎么读取文件
当前位置:我的异常网» J2SE » Java怎么读取文件 Java怎么读取文件 www.myexceptions.net 网友分享于:2013-12-20 浏览:60次 Java如何读取文件? ...
最新文章
- linux下载python的es库,Elasticsearch py客户端库安装及使用方法解析
- 浏览器市场占有率_分水岭初现 全球浏览器市场现状及竞争格局分析
- 微软创立全新人工智能实验室,与DeepMind、OpenAI同台竞技
- .Net线程问题解答
- 1.6解不等式 1.6.1 平方根不等式
- 智能工厂系统架构图_一些智能化弱电系统架构图,做方案可以用
- Hexo NexT主题添加点击爱心效果
- 利用composer搭建PHP框架(五.自动加载)
- apt搜索某个软件及版本
- 云IDE:CodeSandbox: 快速进行前端开发的云IDE
- HDLC协议(一)——基本概念
- 设计和构建区块链社交媒体平台
- SDN:简述对各类SDN控制器的认识
- 深度学习基础--Bottleneck(瓶颈) Architectures
- JavaScript时间显示器
- android的一些简单配置修改(2)
- 如何使用PS将一小块图片填充为一个大背景
- 解答c语言的app,你学c语言用的什么app?
- Java方法的分类及使用
- Current Mirror