欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

利用Java读取二进制文件实例详解

程序员文章站 2024-02-25 16:52:57
前言 本文主要给大家介绍了关于java读取二进制文件的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 读hex写csv data目录下有l...

前言

本文主要给大家介绍了关于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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。