没有合适的资源?快使用搜索试试~ 我知道了~
完整版,包含解析工具类,将文件复制到你的项目下,修改路径就可以直接完美运行,将fsn文件解析为对象并进行相关操作。
资源推荐
资源详情
资源评论
package action;
import java.util.ArrayList;
import tools.FsnTools;
import bean.FsnBody;
import bean.FsnModel;
public class FsnReaderAction {
public final static int intstep =2; //Uint16字节长度
public final static int stringstep =4; //Uint32字节长度
public final static int fsnHeadLengh =32;//fsn文件头字节长度
public final static int fsnPerBodyNoImg =100; //fsn文件体每条记录,不包
括图像信息的字节长度
public final static int fsnPerBodyImg =1644; //fsn文件体每条记录,包括
图像信息的字节长度
public int filePos=0; //fsn文件字节流当前指针位置
public FsnModel fm; //本实例解析的FsnMedel对象
public String fsnFilePath ;//FSN文件的存储完整路径,包括文件名
public FsnReaderAction(String filePath){
this.fsnFilePath=filePath;
}
public FsnModel readFsnFile() throws Exception {
// FsnModel ret=null;
try{
this.fm=new FsnModel(this.fsnFilePath);
//hzyimport 把文件转成字节流数组
byte[] fsnbytes =FsnTools.toByteArray (this.fsnFilePath);
this.fm.setSize(fsnbytes.length);
System.out .println("File Lengh: "+fsnbytes.length);
// 读取头文件
setHead(fsnbytes);
long counter = this.fm.getCounter(); // 冠字号信息条数
//
System.out.println("this.fm.getHeadString()[2]="+this.fm.getHeadStr
ing()[2]);
int size = this.fm.getHeadString()[2] != 0x2D ? fsnPerBodyImg :
fsnPerBodyNoImg ;
// System.out.println("this.fm.getHeadString()[2]
="+this.fm.getHeadString()[2] );
// System.out.println("counter ="+counter);
// System.out.println("size="+size);
// System.out.println("counter =* size"+counter * size);
// System.out.println("fsnHeadLengh="+fsnHeadLengh);
//如果fsn文件的长度合一致
if (counter * size + fsnHeadLengh == fsnbytes.length) {
ArrayList<FsnBody> list = new ArrayList<FsnBody>();
long ValutaSum=0;
for (int i = 0; i < counter; i++) {
FsnBody body = new FsnBody();
boolean noException=false; //处理过程中没有异常
//每条fsn信息均从i * size + 32(头的长度)处起始
int thisPosSart=i * size + fsnHeadLengh ;
//此处处理非常重要,在读取图片文件前一定要做处理因为图片字节
流长度固定,644位,getSnoExpImg方法只读到图片信息中有数据部分对应的字节流,后
面的都是空值,将不再读取
//某条图片数据读完以后,filePos不一定会移至这个图片数据对应
的结尾位置,要在读取下一条数据时,强制将filePos指向下一条图片信息对应字节流起
始位置
if(filePos<thisPosSart){
filePos=thisPosSart;
}
body = getSnoExpImg(fsnbytes);
body.setRecordNum(i+1); //此条fsn记录在fsn文件中的顺序
ValutaSum += body.getValuta();
if(size!=fsnPerBodyNoImg ){
testSnoImg(fsnbytes); //校验图片数据合法性,如果不合
法,将抛出异
//map.put("ImageSno", imageSno); //图片BufferedImage
对象 ,不能将此数据放入map,一是数据量大时内存溢出,二是效率大打折
byte[] imgbytes=FsnTools.byteCopy (fsnbytes,
thisPosSart+fsnPerBodyNoImg , size-fsnPerBodyNoImg );
body.setImageBytes(imgbytes); //图片字节数组数据
imgbytes=null; //及时释放图片字节数组对象,释放内
}else{
//map.put("ImageSno", null);
body.setImageBytes(null);
}
noException=true;
if(noException){ //当没有异常时记录解析数据
list.add(body);
}else{
if(this.fm.isPermitException()){ //当有异常时,如果
fsn配置文件允许记录异常,则记录,否则不记录
list.add(body);
}
}
}
this.fm.setBodys(list) ;
}
}catch(Exception e){
this.fm.setAnalysisExcepted(true);
this.fm.setAnalysisErrorMsg(e.getMessage());
//写日志
}
return this.fm;
}
/**
* 获取Fsn每条记录中的图片对象
* @param fsnBytes fsn文件的byte字节流对
* @return
*/
public void testSnoImg(byte[] fsnBytes) throws Exception{
//冠字号码的个数
int num = parseInt(fsnBytes);
//每个冠字号码的图像宽
int height = parseInt(fsnBytes);
int width = parseInt(fsnBytes);
int Reserve2 = parseInt(fsnBytes);
// 图片三维不能小于0
if(num<=0||height<=0||width<=0){
throw new Exception("图片数据读取失败,长宽和字符数均不能小于等于
0");
}
//冠字号码个数不能多于12
if(num>12){
throw new Exception("图片数据读取失败,冠字号码个数不能多");
}
//图片大小不能多于图片缓冲区的总大小,减去108位,包括100位其他字段和8
位图像meta
long mutiall = 4 * width * num;
if (mutiall > fsnPerBodyImg - 108){
throw new Exception("图像数据读取失败,图像长度大于图像缓冲器长度
");
}
//int i = 0;
//while ( i < width * num) {
//byte[] pic=parseByte(fsnBytes,4);
//String s=MessageUtil.toBinaryString(pic);
//i++;
//}
}
public FsnBody getSnoExpImg(byte[] fsnBytes) {
FsnBody body = new FsnBody();
// 设置日期时间
int data = parseInt(fsnBytes);
int time = parseInt(fsnBytes);
// System.out.println("data="+data);
// System.out.println("time="+time);
/*if(time<0){
time=-time;
}*/
int y = data >> 9;
int m = (data - (y << 9)) >> 5;
int d = data - (y << 9) - (m << 5);
int hh = time >> 11;
int mm = (time - (hh << 11)) >> 5;
int ss = (time - (hh << 11) - (mm << 5)) << 1;
/*
String DateStr= StrUtil.numAddZero(String.valueOf((y + 1980) ),4)+
"-" + StrUtil.numAddZero(String.valueOf(m),2) + "-" +
StrUtil.numAddZero(String.valueOf(d),2);
String TimeStr=hh + ":" + mm+ ":" + ss;
body.setDateStr(DateStr);
body.setTimeStr( TimeStr);
//*/
//*
StringBuffer DateBuf=new StringBuffer();
StringBuffer TimeBuf=new StringBuffer();
DateBuf.append( y + 1980);
DateBuf.append( "-");
DateBuf.append( FsnTools.numAddZero (m,2) );
DateBuf.append( "-");
DateBuf.append( FsnTools.numAddZero (d,2) );
TimeBuf.append(FsnTools.numAddZero (hh,2) );
TimeBuf.append(":");
TimeBuf.append(FsnTools.numAddZero (mm,2) );
TimeBuf.append(":");
TimeBuf.append(FsnTools.numAddZero (ss,2 ));
body.setDateStr(DateBuf.toString());
body.setTimeStr( TimeBuf.toString());
body.setDateStr(DateBuf.toString());
body.setTimeStr( TimeBuf.toString());
body.setDateTime( body.getDateStr() + " " + body.getTimeStr());
剩余25页未读,继续阅读
资源评论
小刘爱搬砖
- 粉丝: 67
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功