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之读取二进制文件相关推荐

  1. java读二进制bin文件内容_利用Java读取二进制文件示例详细解说

    前言 此文主要给大伙介绍了关于Java读取二进制文件的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 读Hex写CSV data目录下有little-endian bin文 ...

  2. Day1 Java读取二进制文件

    任务:练习Java读取二进制文件,读取文件的前64和最后64个字节. 推荐一个十六进制在线编辑器:HexEd.it - Browser-based Online and Offline Hex Ed. ...

  3. java怎么读取二进制_Java如何实现读取二进制文件

    Java如何实现读取二进制文件 发布时间:2020-11-10 16:19:46 来源:亿速云 阅读:83 作者:Leah 这篇文章运用简单易懂的例子给大家介绍Java如何实现读取二进制文件,内容非常 ...

  4. java读取二进制文件数据

    java读取二进制文件数据 1.读取文件信息 java提供多种读取方式: /*** 按字节读取文件数据* @param fileName 文件路径包括文件名*/public static void r ...

  5. java 遍历二进制_读取二进制文件并循环遍历每个字节

    在Python中读取二进制文件并循环遍历每个字节 Python 3.5中的新功能是 pathlib 模块,它有一个特别方便的方法来读取文件中的字节,允许我们迭代字节 . 我认为这是一个体面的(如果快速 ...

  6. c语言fread无法存储,【求助】C语言fread读取二进制文件时,读取结果全都是零

    C语言fread读取二进制文件时,读取结果全都是零,编译运行都没问题,但是就是结果显示不对,猜想可能有几个原因: 1. 大小端没处理好,设置了程序判断机器为little endian,但是,身为小白的 ...

  7. Java多线程读取本地照片为二进制流,并根据系统核数动态确定线程数

    Java多线程读取图片内容并返回 1. ExecutorService线程池 2. 效率截图 3. 源码 1. ExecutorService线程池 ExecutorService线程池,并可根据系统 ...

  8. java中读取properties文件内容五种方式

    一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题.就借此机会把Spring+SpringMVC ...

  9. 怎么读取java文件,Java怎么读取文件

    当前位置:我的异常网» J2SE » Java怎么读取文件 Java怎么读取文件 www.myexceptions.net  网友分享于:2013-12-20  浏览:60次 Java如何读取文件? ...

最新文章

  1. linux下载python的es库,Elasticsearch py客户端库安装及使用方法解析
  2. 浏览器市场占有率_分水岭初现 全球浏览器市场现状及竞争格局分析
  3. 微软创立全新人工智能实验室,与DeepMind、OpenAI同台竞技
  4. .Net线程问题解答
  5. 1.6解不等式 1.6.1 平方根不等式
  6. 智能工厂系统架构图_一些智能化弱电系统架构图,做方案可以用
  7. Hexo NexT主题添加点击爱心效果
  8. 利用composer搭建PHP框架(五.自动加载)
  9. apt搜索某个软件及版本
  10. 云IDE:CodeSandbox: 快速进行前端开发的云IDE
  11. HDLC协议(一)——基本概念
  12. 设计和构建区块链社交媒体平台
  13. SDN:简述对各类SDN控制器的认识
  14. 深度学习基础--Bottleneck(瓶颈) Architectures
  15. JavaScript时间显示器
  16. android的一些简单配置修改(2)
  17. 如何使用PS将一小块图片填充为一个大背景
  18. 解答c语言的app,你学c语言用的什么app?
  19. Java方法的分类及使用
  20. Current Mirror

热门文章

  1. java抽象类为什么不能实例化?
  2. SQLServer 导入导出工具BCP详解
  3. 如何用matlab计算比例尺,宝黛爱情仍属于狭义的才子佳人小说体系。 ( )
  4. 双系统设置成默认启动Windows的问题
  5. 性能测试指标及优化方案
  6. 钉钉小程序换行和输入空格
  7. 你可以跟 ChatGPT 视频聊天了!
  8. 写在年终岁末,回顾2008,展望2009
  9. 缓存穿透 雪崩 击穿
  10. MATLAB的二维线图绘图函数plot()实例积累