Java如何实现读取二进制文件

这篇文章运用简单易懂的例子给大家介绍Java如何实现读取二进制文件,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

创新互联公司长期为上千余家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为胶州企业提供专业的网站建设、成都网站建设,胶州网站改版等技术服务。拥有十多年丰富建站经验和众多成功案例,为您定制开发。

由于项目需要,需要对二进制文件进行读写、转换。

文件说明:由其他程序得到的二进制文件,文件内容为:包含23543个三角形、13270个顶点的三角网所对应的721组流速矢量(u、v)文件,通俗些说,一条数据包含两个双精度型的数值,每组数组包含23543条数据,如果以一个双精度数值为单位,则总共有23543 * 721 * 2 =33,949,006条数据。由Fortran程序以每 8 Byte存储一个数值的二进制文件存储,最终文件大小为下图所示:

Java如何实现读取二进制文件            

测试:从该文件读出数据之后,转换为十进制,存储到另一个文件中。

/**
 * 针对大文件存储,请依次调用beginSave、AddSave、endSave。
 * 
 * @author CK
 *
 */
public class DataUtil {

  DataOutputStream BinaryOut=null;
  BufferedWriter TextOut=null;
  String FilePath=null;
  enum SaveFileType{Text,Binary};
  SaveFileType SaveFileType;

  /**
   * double转byte[]
   * 
   * @param d
   * @return
   */
  public static byte[] double2Bytes(double d) {
    long value = Double.doubleToRawLongBits(d);
    byte[] byteRet = new byte[8];
    for (int i = 0; i < 8; i++) {
      byteRet[i] = (byte) ((value >> 8 * i) & 0xff);
    }
    return byteRet;
  }

  /**
   * byte[]转double
   * 
   * @param arr
   * @return
   */
  public static double bytes2Double(byte[] arr) {
    long value = 0;
    for (int i = 0; i < 8; i++) {
      value |= ((long) (arr[i] & 0xff)) << (8 * i);
    }
    return Double.longBitsToDouble(value);
  }
  /**
   * 大型数据存储之开始存储
   * @param FilePath 文件路径
   * @param saveFileType 保存的文件类型,文本文件、双精度所存的二进制文件
   * @return
   * @throws IOException
   */
  public boolean BeginSave(String FilePath,SaveFileType saveFileType) throws IOException {
    if (FilePath == "" || FilePath == null) {
      System.out.println("the SavePath is null.");
      return false;
    }
    this.FilePath=FilePath;
    this.SaveFileType=saveFileType;
    File dataFile = new File(FilePath);
    if (!dataFile.getParentFile().exists()) {
      dataFile.getParentFile().mkdirs();
    }
    if (dataFile.exists()) {
      dataFile.delete();
    }
    dataFile.createNewFile();
    switch(this.SaveFileType){
    case Text:
      TextOut= new BufferedWriter(new FileWriter(dataFile,true));
      break;
    case Binary:
      BinaryOut = new DataOutputStream(new FileOutputStream(dataFile,true));
      break;
    default:
      break;
      
    }    
    return true;
  }
/**
 * 大型文件存储之追加存储
 * @param DataStr 若是文本存储则无要求,若是双精度的二进制文件,以若干空格隔开
 * @return
 * @throws IOException
 */
  public boolean AddSave(String DataStr) throws IOException{
    switch(this.SaveFileType){
    case Text:
      this.TextOut.append(DataStr);
      break;
    case Binary:
      DataStr=DataStr.trim();
      String[] dataArray=DataStr.split("\\s+");
      for(int i=0;i

代码说明:其中byte[]与double互转为在互联网上查到的方法,具体是哪位大神的我忘记了,在这里为了记录就贴出来啦,上述代码包含了处理小型文件时,将所有内容存在缓存中,之后再一次性写入文本文件、二进制文件中的方法,还包含了对较大型文件的读写方法,下面是自己的一个读写测试。

/**
 * 测试二进制大文件读写(200M左右)
 * @author ck
 *
 */
public class FileTest {
  static String inputFilePath=""; //输入文件路径,包含文件名后缀
  static String outputFilePath=""; //输出文件名,包含文件名后缀
  
  public static void file2file() throws IOException{
    DataUtil dataUtil=new DataUtil(); 
     DataInputStream br=new DataInputStream( 
         new BufferedInputStream( 
         new FileInputStream(inputFilePath))); 
        dataUtil.BeginSave(outputFilePath, SaveFileType.Text); //初始化,创建文件,采用文件追加存储的思路
         byte[] oneData=new byte[8];
         int i=0,count =0 ;
        while(br.read(oneData, 0, 8)!=-1){  
          i=i+1;
          dataUtil.AddSave(String.valueOf(DataUtil.bytes2Double(oneData)));          
          if(i/23543==0){
            count++;
            System.out.println(count+"\n");

          }
        }
        dataUtil.EndSave();    //将还在缓存中的数据写入到文件中,关闭文件。 
  }
}

 此次测试代码很快就run完了,但是输出文件的生成大概用了近半分钟(刻意秒表计时了一次),尝试用一次性读写的办法,卡很久,也没有出结果。所得的十进制文本文件,大小为这么多:

Java如何实现读取二进制文件

关于Java如何实现读取二进制文件就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


本文名称:Java如何实现读取二进制文件
文章链接:http://pwwzsj.com/article/ihgsdd.html