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

发布时间:2020-11-10 16:19:46

来源:亿速云

阅读:83

作者:Leah

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

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

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

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

/**

* 针对大文件存储,请依次调用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

this.BinaryOut.write(double2Bytes(Double.parseDouble(dataArray[i])));

}

break;

default:

break;

}

return true;

}

/**

* 大型文件存储之结束保存,清空缓存、关闭文件。

* @return

* @throws IOException

*/

public boolean EndSave() throws IOException{

switch(this.SaveFileType){

case Text:

this.TextOut.flush();

this.TextOut.close();

break;

case Binary:

this.BinaryOut.flush();

this.BinaryOut.close();

break;

default:

break;

}

return true;

}

/**

* 将字符串保存为文本文件(一次完成)

*

* @param DataStr

* 文件内容

* @param SavePath

* 文件路径,包含文件名、后缀

* @return

* @throws IOException

*/

public boolean saveTextFile(String DataStr, String SavePath)

throws IOException {

if (DataStr == "" || DataStr == null) {

System.out.println("the dataStr is null.");

return false;

}

if (SavePath == "" || SavePath == null) {

System.out.println("the SavePath is null.");

return false;

}

File dataFile = new File(SavePath);

if (!dataFile.getParentFile().exists()) {

dataFile.getParentFile().mkdirs();

}

if (dataFile.exists()) {

dataFile.delete();

}

dataFile.createNewFile();

BufferedWriter out;

out = new BufferedWriter(new FileWriter(dataFile));

out.append(DataStr);

out.flush();

out.close();

return true;

}

/**

* 双精度存为二进制数据(一次存储)

*

* @param DataStr 双精度数据组成的字符串,以若干空格隔开

* @param OutputPath

* @return

* @throws IOException

*/

public boolean saveBinaryFile(String DataStr, String OutputPath) throws IOException {

if (DataStr == "" || DataStr == null) {

System.out.println("the dataStr is null.");

return false;

}

if (OutputPath == "" || OutputPath == null) {

System.out.println("the OutputPath is null.");

return false;

}

File dataFile = new File(OutputPath);

if (!dataFile.getParentFile().exists()) {

dataFile.getParentFile().mkdirs();

}

if (dataFile.exists()) {

dataFile.delete();

}

dataFile.createNewFile();

DataOutputStream out;

out = new DataOutputStream(new FileOutputStream(dataFile));

// 数据处理

DataStr=DataStr.trim();

String[] dataArray=DataStr.split("\\s+");

for(int i=0;i

out.write(double2Bytes(Double.parseDouble(dataArray[i])));

}

out.flush();

out.close();

return true;

}

}

代码说明:其中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如何实现读取二进制文件相关推荐

  1. java 读文件 二进制_JAVA中读取文件(二进制,字符)内容的几种方法总结

    JAVA中读取文件内容的方法有很多,比如按字节读取文件内容,按字符读取文件内容,按行读取文件内容,随机读取文件内容等方法,本文就以上方法的具体实现给出代码,需要的可以直接复制使用 public cla ...

  2. java 按字节读入_Java按字节读取文件

    [题外话]今天学习了Object-c.通过看书发现,Object-c跟大多数面向对象的语言一样,是很有意思的语言.里面的语法跟Java还有C++,形式上有些差异.至于我为什么要学OC,这个是因为工作需 ...

  3. java解析excel公式_Java 添加、读取Excel公式

    Excel是办公室自动化中非常重要的一款软件,具有强大的数据分析和处理功能.其中,Excel公式(包括函数)起了非常重要的作用.因此,掌握处理公式的能力有利于提高对Excel的应用水平,进而提高工作效 ...

  4. java根据文件路径读取文件_java根据路径读取文件

    展开全部 其读取e69da5e6ba903231313335323631343130323136353331333365643632方法为:import java.io.File; import ja ...

  5. java socket 读取文件_java中ServerSocket读取文件流不是分行读取

    在学习socket的TCP通讯 在使用 TCP传一个文件时 遇到这样两个问题 1. 服务端流读取时一次性读了所有内容 而不是分行读取 2. 自动刷新不生效 代码如下 package com.fuge. ...

  6. java excel 兼容问题_Java之POI读取Excel的解决兼容性问题

    在Java中,使用POI来进行excel的读取和解析是常用的一种做法:在office的excel中存在2007,2003两种不同的格式,通常情况下是以xls/xlsx的不同后缀来区分的,但用户可能不知 ...

  7. java properties读取 封装_java properties 文件读取踩坑记

    当然,读取不到配置文件,是线上和开发环境结果不同这种情况.开发线下环境,明明读取正常,一放到线上,杯具了,没读取到. 然后呢?当然是看看线上这个目录下有没有这个文件,ftp上去一看,文件有啊,目录也对 ...

  8. java xml 读取库_Java开发中读取XML与properties配置文件的方法

    相关阅读: 1. XML文件: 什么是XML?XML一般是指可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言. 2.XML文件的优点: 1)XML文档内容和结构完 ...

  9. java map 泛型 反射_Java通过反射读取泛型

    packagecom.waibizi;importjava.lang.reflect.Method;importjava.lang.reflect.ParameterizedType;importja ...

最新文章

  1. Nginx 性能调优实战
  2. openCV笔记(持续更新)
  3. Python原来这么厉害,我震惊了!
  4. Restangular的使用
  5. 猎豹MFC--文件对话框CFileDialog
  6. elementui 上传七牛_element ui使用上传组件上传文件到七牛(qiniu-js)
  7. 120天的努力,从牵引力教育开始逆袭的!
  8. 如果延迟退休势在必行,区块链如何助力“养老助老”?
  9. Kubernetes存储Longhorn
  10. 影视后期制作学习(AE)(父子级链接-表达式)
  11. Python 基础:04 容器类型
  12. 猿人学web端爬虫攻防大赛赛题解析_第一题:源码乱码
  13. python爬虫爬取网易云音乐下载_Python爬虫实践-网易云音乐!没有版权又如何!照样爬取!...
  14. Android圆形头像图Circle ImageView
  15. 赚钱的方式,很有道理!!!!
  16. 为Blog添加广告语
  17. charles+drony+android监听websocket
  18. ubuntu 下安装AMD显卡驱动
  19. 读取风云二号文件三种方式(主要用于学习IDL读取图像)
  20. HFZ Activator Ramdisk绕过iPhone/ipad激活锁,支持最新iOS15.0-iOS16.3

热门文章

  1. YOLO9000, Better, Faster, Stronger论文翻译——中文版
  2. 开源众包公众号--我们的移动端快速发包功能上线了。
  3. netstat -nat
  4. Codeforces Round #618 (Div. 2)C、Anu Has a Function
  5. 关于SQL数据库 msdb.dbo.sp_send_dbmail 函数发送邮件的场景分析
  6. sshpass离线rpm包
  7. Kong网关upstream健康检查机制
  8. 我用rpgmaker mv制作插件版牧场游戏范例
  9. 一号护工平台开发系统源码项目
  10. ios手机访问服务器文件共享,iOS/iPhone访问Windows/Mac的共享文件(网上邻居)