利用Java读取二进制文件实例详解
作者:RustFisher 发布时间:2023-07-27 03:25:42
标签:java,二进制文件
前言
本文主要给大家介绍了关于Java读取二进制文件的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
读Hex写CSV
data目录下有little-endian bin文件,2个字节代表一个数字。
bin存储的数据格式可自己定义。相同的方法可以直接应用到Android中。
`-- networkProj
|-- data
|-- networkProj.iml
|-- out
`-- src
实现方法
private static void convertFiles() {
File folder = new File("data"); // data folder
log("--------- Read little-endian data from bin file ---------");
if (!folder.exists()) {
log("folder is not exist!");
return;
}
File outputFolder = new File(folder.getAbsolutePath() + File.separator + "output");
if (!outputFolder.exists()) {
boolean newOutput = outputFolder.mkdir();
log("New output folder " + newOutput);
}
File[] files = folder.listFiles();
if (files != null) {
log("folder is " + folder.getAbsolutePath());
for (File f : files) {
log("\t" + f.getName());
}
} else {
log("Nothing in this folder");
return;
}
for (File currentFile : files) {
if (!currentFile.isFile()) {
return;
}
String fileName = currentFile.getName();
fileName = fileName.substring(0, fileName.length() - 4); // delete suffix
File csvFile = new File(outputFolder.getAbsolutePath() + File.separator + fileName + ".csv");
if (csvFile.exists()) {
boolean deRes = csvFile.delete();
log("Delete old csv: " + deRes);
}
byte[] readBytes = new byte[512];
try {
boolean newCsv = csvFile.createNewFile();
log(csvFile.getAbsolutePath() + " " + newCsv);
FileOutputStream csvFos = new FileOutputStream(csvFile);
InputStream in = new FileInputStream(currentFile);
while (in.read(readBytes) != -1) {
int[] csvData = convertBytesToInts(readBytes);
for (int d : csvData) {
csvFos.write(String.valueOf(d).getBytes());
csvFos.write("\n".getBytes());
}
}
csvFos.flush();
csvFos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
// little-endian; 2 bytes -> 1 int
private static int[] convertBytesToInts(byte[] inputData) {
int[] rawData = new int[inputData.length / 2];
int rawIndex = 0;
for (int i = 0; i < inputData.length; i += 2) {
int raw = (0xff & inputData[i + 1]) * 256 + (0xff & inputData[i]);
if (raw >= 32768) {
raw -= 65536;
}
rawData[rawIndex] = raw;
rawIndex++;
}
return rawData;
}
private static void log(String l) {
System.out.println(l);
}
控制台输出
--------- Read little-endian data from bin file ---------
New output folder true
folder is G:\javaProj\networkProj\data
data20170215_180621.bin
output
G:\javaProj\networkProj\data\output\data20170215_180621.csv true
来源:http://rustfisher.github.io/2017/02/16/Java_note/Java_Read_Hex_write_csv/
0
投稿
猜你喜欢
- 在谈 JVM 内存区域划分之前,我们先来看一下 Java 程序的具体执行过程,我画了一幅图。Java 源代码文件经过编译器编译后生成字节码文
- 前言本文将实现一个MyBatis的Springboot的Starter包,引用这个Starter包后,仅需要提供少量配置信息,就能够完成My
- 实例如下:import java.lang.reflect.Field;import java.lang.reflect.Invocatio
- 背景今天面试字节算法岗时被问到的问题,让我用C++实现一个softmax函数。softmax是逻辑回归在多分类问题上的推广。大概的公式如下:
- 序言小编在项目中有遇到使用 flutter 实现扫码枪接入的需求。为方便使用,小编把能力封装成 package 并发布。好记性不如烂笔头,下
- android线程消息机制主要由Handler,Looper,Message和MessageQuene四个部分组成。平常在开发中,我们常用来
- 构造方法以及参数:PageView可用于Widget的整屏滑动切换,如当代常用的短视频APP中的上下滑动切换的功能,也可用于横向页面的切换,
- activity A和BA 获取数据的activity B返回数据的activity点击A上的按钮,在A的textview上显示
- 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。 一、静态库和动态库的区别1. 静态函数库这类库的
- 背景:在Android中按照数据保存的方式,可以分为如下几种Content Provider (用的SQLite实现),SQLite,Sha
- Android5.0之后提供了JobService和JobScheduler,用于在稍后的某个时间点或者当满足某个特定的条件时执行一个任务
- 效果展示在实际项目当中我们经常看到如下各种剪裁形状的效果,Flutter 为我们提供了非常方便的 Widget 很轻松就可以实现,下面我们来
- 前言之前用简书的时候一直是在web端,后来下载了客户端,看到了搜索的那个动画,就尝试的去写了,没写之前感觉挺容易的,写了之后,就感觉里面还是
- 逆时针画圆弧,原理:将360度分割成36份,分别标出每10度角度时的坐标点,然后将每个点连接起来。 #include <io
- 个人理解:把一个类里的多个命令分离出来,每个类里放一个命令,实现解耦合,一个类只对应一个功能,在使用命令时由另一个类来统一管理所有命令。缺点
- 本文主要给大家介绍了关于Java8中Optional类型和Kotlin中可空类型使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一
- 本文实例讲述了C++实现的链表类。分享给大家供大家参考。具体如下:#include <iostream>using namesp
- Android手势解锁本文讲述的是一个手势解锁的库,可以定制显示隐藏宫格点、路径、并且带有小九宫格显示图,和震动!让你学会使用这个简单,高效
- 最近在看《.NET游戏编程入门经典 C#篇》 第一章介绍了如何制作俄罗斯方块,自己试了试按照书上的步骤,可算是完成了。于是写下这篇文章留作纪
- 背景最近好几个项目在运行过程中客户都提出文件上传大小的限制能否设置的大一些,用户经常需要上传好几个G的资料文件,如图纸,视频等,并且需要在上