二进制文件的读写(mina-core-2.0.0-RC1.jar)

公司拿来个二进制文件要我读出来了,我当时就有点闷,这文件里面的东西我看不见我怎么着手呢?当时人多不好当面在领导面前说出来,结果拿回去左看又看还是不懂,最好问领导。他说你现在还要先生成,然后在读出来。这下就好办了,自己生成那还不好办,自己读自己写的东西那就更好办了,哈哈。代码如下:

这是写的

package org.report;

import java.io.File;
import java.io.IOException;
import java.nio.charset.CharacterCodingException;
import org.apache.commons.io.FileUtils;
import org.apache.mina.core.buffer.IoBuffer;
import org.cfg.ConfigProperties;
/**
* @author 柳青
*
* 2010-11-14
*/
public class WriteData {

public void writer(IoBuffer buffer){
byte[] bytes=null;
try{
buffer.flip();
bytes=new byte[buffer.remaining()];
buffer.get(bytes);
String filePath="Test.pr";
File file=new File("D:/"+filePath);
FileUtils.writeByteArrayToFile(file, bytes);
}
catch (IOException e)
{
e.printStackTrace();
}
}
/**
* 此方法是用来求的字符串的长度
* (包括中文和英文)
* @param str
* @return
*/
public static int getByte(String str){
byte[] by=str.getBytes();
int length=by.length;
return length;
}
/**
* @param args
* @throws CharacterCodingException
*/
public static void main(String[] args) throws CharacterCodingException {
// TODO Auto-generated method stub
IoBuffer buffer=IoBuffer.allocate(100).setAutoExpand(true);
buffer.putInt(1);

String reportTeam="贵州送变电工程公司_10标段";
buffer.put((byte)WriteData .getByte(reportTeam));
buffer.putString(reportTeam,ConfigProperties.encoder);
//用户名
String reportUser="asdf1";
buffer.put((byte)WriteData .getByte(reportUser));
buffer.putString(reportUser,ConfigProperties.encoder);
//日期
buffer.putInt(20101111);

//冻土和人员数目
buffer.putInt(11);
buffer.putInt(22);
buffer.putInt(33);
buffer.putInt(44);
buffer.putInt(55);
buffer.putInt(66);
buffer.putInt(77);

//天气、材料、存在问题
String weather="很好";
buffer.putInt(WriteData.getByte(weather));
buffer.putString(weather,ConfigProperties.encoder);
String material="一般";
buffer.putInt(WriteData.getByte(material));
buffer.putString(material,ConfigProperties.encoder);
String problems="还行";
buffer.putInt(WriteData.getByte(problems));
buffer.putString(problems,ConfigProperties.encoder);

//towers长度
buffer.putShort((short)2);

//塔号、桩号、塔型
String towerNo="22222222";
buffer.put((byte)WriteData .getByte(towerNo));
buffer.putString(towerNo,ConfigProperties.encoder);
String stakeNo="6106";
buffer.put((byte)WriteData .getByte(stakeNo));
buffer.putString(stakeNo,ConfigProperties.encoder);
String towerMode="333333333";
buffer.put((byte)WriteData .getByte(towerMode));
buffer.putString(towerMode,ConfigProperties.encoder);

//冻土类型和装配类型
buffer.put((byte) 1);buffer.put((byte) 0);
//状态和时间
buffer.put((byte) 1);buffer.putInt(20101111);
buffer.put((byte) 2);buffer.putInt(20101113);
buffer.put((byte) 3);buffer.putInt(20101115);
buffer.put((byte) 4);buffer.putInt(20101118);
buffer.put((byte) 5);buffer.putInt(20101119);

//下面重复
towerNo="22222222";
buffer.put((byte)WriteData .getByte(towerNo));
buffer.putString(towerNo,ConfigProperties.encoder);
stakeNo="6106";
buffer.put((byte)WriteData .getByte(stakeNo));
buffer.putString(stakeNo,ConfigProperties.encoder);
towerMode="333333333";
buffer.put((byte)WriteData .getByte(towerMode));
buffer.putString(towerMode,ConfigProperties.encoder);
buffer.put((byte) 1);buffer.put((byte) 0);
buffer.put((byte) 1);buffer.putInt(20101111);
buffer.put((byte) 2);buffer.putInt(20101113);
buffer.put((byte) 3);buffer.putInt(20101115);
buffer.put((byte) 4);buffer.putInt(20101118);
buffer.put((byte) 5);buffer.putInt(20101119);

buffer.putString("end",32,ConfigProperties.encoder);
WriteData writeData=new WriteData();
writeData.writer(buffer);
}

}



下面是读上面写的:




package org.report;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;


import org.apache.commons.io.FileUtils;
import org.apache.mina.core.buffer.IoBuffer;

public class ReportReader
{
public static void main(String[] args){
File file=new File("D:/Test.pr");
byte[] bs=null;
try
{
bs=FileUtils.readFileToByteArray(file);
}
catch (IOException e)
{
e.printStackTrace();
}
ReportData[] reports=null;
try
{
reports=ReportReader.getReport(bs);
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(reports);
}
public static ReportData[] getReport(byte[] bs)throws Exception{
if(bs==null)return null;
CharsetDecoder decoder=Charset.forName("gb2312").newDecoder();
IoBuffer buf=IoBuffer.allocate(bs.length);
buf.put(bs);
buf.flip();
System.out.println("文件大小:"+buf.limit());
int m=buf.getInt();
System.out.println("文件数:"+m);
ReportData[] redata=new ReportData[m];
for(int t=0;t<m;t++){
ReportData data=new ReportData();
redata[t]=data;
int length=buf.get();
if(length>0){
data.reportTeam=buf.getString(length, decoder);
System.out.println(data.reportTeam);
}
length=buf.get();
if(length>0){
data.reportUser=buf.getString(length, decoder);
System.out.println(data.reportUser);
}
data.reportDate=buf.getInt();
System.out.println(data.reportDate);
data.segment=new SegmentData();


data.segment.yearYDT=buf.getInt();System.out.println(data.segment.yearYDT);
data.segment.yearJDT=buf.getInt();System.out.println(data.segment.yearJDT);
data.segment.weekYDT=buf.getInt();System.out.println(data.segment.weekYDT);
data.segment.weekJDT=buf.getInt();System.out.println(data.segment.weekJDT);
data.segment.executNum=buf.getInt();System.out.println(data.segment.executNum);
data.segment.supervisorNum=buf.getInt();System.out.println(data.segment.supervisorNum);
data.segment.designerNum=buf.getInt();System.out.println(data.segment.designerNum);

length=buf.getInt();
if(length>0){
data.segment.weather=buf.getString(length, decoder);
}
length=buf.getInt();
if(length>0){
data.segment.material=buf.getString(length, decoder);
}
length=buf.getInt();
if(length>0){
data.segment.problems=buf.getString(length, decoder);
}
System.out.println("天气:"+data.segment.weather);
System.out.println("材料:"+data.segment.material);
System.out.println("问题:"+data.segment.problems);
length=buf.getShort();
data.toweres=new TowerData[length];
System.out.println("towers长度:"+length);


修改的地方//
int nolength=0;
for(int i=0;i<length;i++){
System.out.println("-----------------------------------------");
TowerData tower=new TowerData();
data.toweres[i]=tower;
nolength=buf.get();
tower.towerNo=buf.getString(nolength,decoder);
System.out.println("塔号"+tower.towerNo);
nolength=buf.get();
tower.stakeNo=buf.getString(nolength,decoder);
System.out.println("桩号"+tower.stakeNo);
nolength=buf.get();
tower.towerMode=buf.getString(nolength,decoder);
System.out.println("塔型"+tower.towerMode);

tower.frozenMode=buf.get();
System.out.println("冻土类型 多年冻土或是季节冻土"+tower.frozenMode);
tower.baseMode=buf.get();
System.out.println("装配类型,或非装配类型"+tower.baseMode);

tower.excavateState=Integer.toString(buf.get());//String(GlobalConst.STATE_LABELS[ba.readByte()]);
System.out.println("基础施工状态"+tower.excavateState);
tower.excavateFinishTime=Integer.toString(buf.getInt());
System.out.println("施工完成时间"+tower.excavateFinishTime);

tower.executState=Integer.toString(buf.get());
System.out.println("组塔状态"+tower.executState);
tower.executFinishTime=Integer.toString(buf.getInt());
System.out.println("组塔完成时间"+tower.executFinishTime);

tower.groupState=Integer.toString(buf.get());
System.out.println("架线状态"+tower.groupState);
tower.groupFinishTime=Integer.toString(buf.getInt());
System.out.println("架线完成时间"+tower.groupFinishTime);

tower.stringingState=Integer.toString(buf.get());//ba.writeByte(GlobalConst.getIndex(tower.stringingState,GlobalConst.STATE_LABELS));
System.out.println("附件工程状态"+tower.stringingState);
tower.stringingFinishTime=Integer.toString(buf.getInt());//ba.writeInt(GlobalConst.getIntDate(tower.stringingFinishTime));
System.out.println("附件工程完成时间"+tower.stringingFinishTime);

tower.adjunctState=Integer.toString(buf.get());
System.out.println("附件工程状态"+tower.adjunctState);
tower.adjunctFinishTime=Integer.toString(buf.getInt());
System.out.println("附件工程完成时间"+tower.adjunctFinishTime);
}
System.out.println(buf.position());
buf.position(buf.position()+6);//跳过标记
redata[t]=data;
}
return redata;
}
}



注意:上面程序是要导入mina-core-2.0.0-RC1.jar才能运行的
写的时候ConfigProperties.encoder是一种编码
还有读的时候像ReportData[] redata=new ReportData[m];是一些基本类的

还有其他问题请留言
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值