java解析FSN文件.doc

合集下载

JAVA读取WORD文档解决方案

JAVA读取WORD文档解决方案

JAVA读取WORD文档解决方案在Java中读取Word文档需要使用特定的Java库或API来解析和处理Word文档格式(.doc或.docx)。

在下面的解决方案中,我们将介绍两种流行的Java库,即Apache POI和JavaFX的XSSF。

1. Apache POI:Apache POI是一个流行的开源Java库,用于处理Microsoft Office 格式的文件,包括Word文档。

下面是使用Apache POI库读取Word文档的步骤:1.1 添加Apache POI依赖库到项目中。

在Maven项目中,可以在pom.xml文件中添加以下依赖项:```xml<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>```1.2 使用`XWPFDocument`类打开Word文档。

下面是一个示例代码:```javaFileInputStream fis = newFileInputStream("path/to/word/document.docx");XWPFDocument document = new XWPFDocument(fis);fis.close(;```1.3 使用`XWPFParagraph`类和`XWPFRun`类来遍历Word文档中的段落和文本。

java解析FSN文件

java解析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);// 图片三维不能小于0if(num<=0||height<=0||width<=0){throw new Exception("图片数据读取失败,长宽和字符数均不能小于等于0");}//冠字号码个数不能多于12if(num>12){throw new Exception("图片数据读取失败,冠字号码个数不能多");}//图片大小不能多于图片缓冲区的总大小,减去108位,包括100位其他字段和8位图像metalong 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());// 设置货币真假残和旧币标志body.setTfFlag(parseInt(fsnBytes));// 设置货币错误StringBuffer errorCode = new StringBuffer();/*for (int i = 0; i < 3; i++) {int code = parseInt(fsnBytes);if (code < 13 && code > 0) {errorCode += code + ",";}}if ("1".equals(map.get("TfFlag")))errorCode = errorCode.substring(0, stIndexOf(","));elseerrorCode = "0";*/for (int i = 0; i < 3; i++) {int code = parseInt(fsnBytes);if(i==0){errorCode.append(code);}else{errorCode.append(":") ;errorCode.append(code);}}body.setErrorCode(errorCode.toString());// 设置币种标志String moneyFlag = "";for (int i = 0; i < 4; i++) {int flag = parseInt(fsnBytes);if (flag != 0) {moneyFlag += (char) flag;}}body.setMoneyFlag( moneyFlag);// 设置年版或版本号标志int ver = parseInt(fsnBytes);//body.setVer(FsnTool.deMoneyVer(ver));body.setVer(ver);// 设置币body.setValuta(parseInt(fsnBytes));// 设置冠字号位body.setCharNum(parseInt(fsnBytes));// 设置冠字StringBuffer no = new StringBuffer();for (int i = 0; i < 12; i++) {int No = parseInt(fsnBytes);if (No != 0)no.append( (char) No);}body.setSno(no.toString());// 设置机具编号StringBuffer machineSNo =new StringBuffer();for (int i = 0; i < 24; i++) {int Msno = parseInt(fsnBytes);if (Msno != 0)machineSNo.append( (char) Msno);}body.setMachineSno( machineSNo.toString());// 设置冠字号保留字body.setReserve1( parseInt(fsnBytes));// System.out.println("时间="+body.getDateStr() + " " +body.getTimeStr()+"|真假币标志="+body.getTfFlag()+"|表示最多3组假币特征码="+body.getErrorCode()+"|"+// "|币种标志="+body.getMoneyFlag()+"|年版或版本号标志="+body.getVer()+"|币值="+body.getValuta()+"|冠字号码字符数="+body.getCharNum()+"|存放识别的冠字号码="+// body.getSno()+"|机具编号="+body.getMachineSno()+"|保留字1="+body.getRecordNum());return body;}public void setHead(byte[] fsnBytes) throws Exception { this.filePos=0; //读取文件头数据的当前指针位置,设置字节位移从0开始if(this.fm==null){this.fm=new FsnModel(this.fsnFilePath);}int[] headStart = new int[4];for (int i = 0; i < 4; i++) {headStart[i] = parseInt(fsnBytes);// System.out.println("headStart["+i+"]="+headStart[i]);}fm.setHeadStart(headStart);int[] headString = new int[6];for (int i = 0; i < 6; i++) {headString[i] = parseInt(fsnBytes);// System.out.println("headString["+i+"] ="+headString[i]);}fm.setHeadString(headString);long counter =parseLong(fsnBytes);// System.out.println("counter="+counter);fm.setCounter(counter);int[] headEnd = new int[4];for (int i = 0; i < 4; i++) {headEnd[i] = parseInt(fsnBytes);// System.out.println("headEnd["+i+"]="+headEnd[i]);}fm.setHeadEnd(headEnd);}public int parseInt(byte[] fsnBytes){intret=(int)FsnTools.demarshallintLittle(fsnBytes,filePos,intstep);this.filePos +=intstep;// System.out.println("this.filePos="+this.filePos+"||ret="+ret);return ret;}public long parseLong(byte[] fsnBytes){longret=FsnTools.demarshallintLittle(fsnBytes,filePos,stringstep);this.filePos +=stringstep;return ret;}public byte[] parseByte(byte[] fsnBytes,int length){byte[] ret=FsnTools.convertByteMarshall(fsnBytes,filePos,length);this.filePos +=length;return ret;}}package bean;public class FsnBody {private String DateStr; //验钞启动日期private String TimeStr; //验钞启动时间/**日期+时间* 指定年月日的日期数据的产生算法为: Date = ((Year-1980)<<9) + (Month<<5) + Day其中:Year为年份,大于等于1980;Month为月份;Day为日;指定时分秒的时间数据产生算法为:Time = (Hour<<11) + (Minute<<5) + (Second>>1)其中:0≤Hour < 24,0≤Minute < 60,0≤Second < 60*/private String DateTime; //验钞启动日期+时间private int TfFlag; //真假币标志,0为假币或可疑币,1为真币,2为残币(清分机适用),3为旧币(清分机适用);private String ErrorCode; //表示最多3组假币特征码(特征码有12种,分别为1,2,3,4,5,6,7,8,9,10,11,12),真币时填0;如果只有一组特征码,把特征码填在ErrorCode[0],则其余两组填0;如果有两组特征码,把特征码填在ErrorCode[0]和ErrorCode[1],剩余的一组填0private String MoneyFlag; //币种标志,最多4位大写ASCII英文字母,不足4位的其余位填0:CNY:人民币private int Ver; //年版或版本号标志;人民币用作年版标志,值填0,1,2,分别代表1990,1999,2005三个年版,可根据实际情况扩充;其余币种填9999(表示不考虑年版);private int Valuta; //币值,最大币值为50000private int CharNum; //冠字号码字符数,指明存储在数组SNo的号码个数;private String Sno; //存放识别的冠字号码,每个数组元素存放一位号码(ASCII 字符),最多12位,不足12位的其余位填0;private String MachineSno; //机具编号,必须为24位,每个数组元素存放一位ASCII字符,不足24位的其余位填0;private int Reserve1; //保留字1private int RecordNum; //冠字号信息在Fsn文件中的行号,从1开始private byte[] ImageBytes; //冠字号信息的图片数据字节数组,保存的原始格式,未转换private String ImgStr; //图片压缩后的字符串private String accNo=""; //冠字号信息产生的账号,Atm等自助存取款机才会有此值public String getDateStr() {return DateStr;}public void setDateStr(String dateStr) {DateStr = dateStr;}public String getTimeStr() {return TimeStr;}public void setTimeStr(String timeStr) {TimeStr = timeStr;}public String getDateTime() {return DateTime;}public void setDateTime(String dateTime) {DateTime = dateTime;}public int getTfFlag() {return TfFlag;}public void setTfFlag(int tfFlag) {TfFlag = tfFlag;}public String getErrorCode() {return ErrorCode;}public void setErrorCode(String errorCode) { ErrorCode = errorCode;}public String getMoneyFlag() {return MoneyFlag;}public void setMoneyFlag(String moneyFlag) { MoneyFlag = moneyFlag;}public int getVer() {return Ver;}public void setVer(int ver) {Ver = ver;}public int getValuta() {return Valuta;}public void setValuta(int valuta) {Valuta = valuta;}public int getCharNum() {return CharNum;}public void setCharNum(int charNum) {CharNum = charNum;}public String getSno() {return Sno;}public void setSno(String sno) {Sno = sno;}public String getMachineSno() {return MachineSno;}public void setMachineSno(String machineSno) { MachineSno = machineSno;}public int getReserve1() {return Reserve1;}public void setReserve1(int reserve1) { Reserve1 = reserve1;}public int getRecordNum() {return RecordNum;}public void setRecordNum(int recordNum) {RecordNum = recordNum;}public byte[] getImageBytes() {return ImageBytes;}public void setImageBytes(byte[] imageBytes) {ImageBytes = imageBytes;}public String getImgStr() {return ImgStr;}public void setImgStr(String imgStr) {ImgStr = imgStr;}public String getAccNo() {return accNo;}public void setAccNo(String accNo) {this.accNo = accNo;}}package bean;import java.util.ArrayList;public class FsnModel implements Comparable<FsnModel>{private int[] headStart; // Fsn文件头起始标志,由4个16比特无符号数据组成,内容为十进制数,分别是20,10,7,26;private int[] headString; // Fsn文件体内容,详情参见<冠字号码文件格式说明.doc>private long counter; // 32比特无符号数值,记录当前冠字号码的记录数。

java解析富文本,保留原格式

java解析富文本,保留原格式

java解析富文本,保留原格式在Java 中解析富文本并保留原格式通常涉及到处理HTML 内容。

富文本通常以HTML 的形式表示,因此你可以使用Java 中的一些库来解析和处理HTML。

一个常用的库是Jsoup,它是一个用于解析、提取和操作HTML 文档的Java 库。

以下是一个简单的示例,演示了如何使用Jsoup 解析富文本:首先,你需要在你的项目中引入Jsoup,你可以在Maven 项目中添加以下依赖:```xml<dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.14.3</version> <!-- 请根据实际情况调整版本号--></dependency>```然后,你可以使用以下代码解析富文本:```javaimport org.jsoup.Jsoup;import org.jsoup.nodes.Document;public class RichTextParser {public static void main(String[] args) {String richText = "<p>This is <b>rich</b> <i>text</i> with <a href=\"URL\">links</a>.</p>";// 解析富文本String parsedText = parseRichText(richText);// 输出解析后的文本System.out.println(parsedText);}public static String parseRichText(String richText) {// 使用Jsoup 解析HTMLDocument document = Jsoup.parse(richText);// 获取解析后的文本String parsedText = document.text();return parsedText;}}```这个例子中,`Jsoup.parse(richText)` 会将富文本转换成一个`Document` 对象,然后通过`document.text()` 获取其中的纯文本内容。

java解析FSN文件

java解析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);// 图片三维不能小于0if(num<=0||height<=0||width<=0){throw new Exception("图片数据读取失败,长宽和字符数均不能小于等于0");}//冠字号码个数不能多于12if(num>12){throw new Exception("图片数据读取失败,冠字号码个数不能多");}//图片大小不能多于图片缓冲区的总大小,减去108位,包括100位其他字段和8位图像metalong 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());// 设置货币真假残和旧币标志body.setTfFlag(parseInt(fsnBytes));// 设置货币错误StringBuffer errorCode = new StringBuffer();/*for (int i = 0; i < 3; i++) {int code = parseInt(fsnBytes);if (code < 13 && code > 0) {errorCode += code + ",";}}if ("1".equals(map.get("TfFlag")))errorCode = errorCode.substring(0, stIndexOf(","));elseerrorCode = "0";*/for (int i = 0; i < 3; i++) {int code = parseInt(fsnBytes);if(i==0){errorCode.append(code);}else{errorCode.append(":") ;errorCode.append(code);}}body.setErrorCode(errorCode.toString());// 设置币种标志String moneyFlag = "";for (int i = 0; i < 4; i++) {int flag = parseInt(fsnBytes);if (flag != 0) {moneyFlag += (char) flag;}}body.setMoneyFlag( moneyFlag);// 设置年版或版本号标志int ver = parseInt(fsnBytes);//body.setVer(FsnTool.deMoneyVer(ver));body.setVer(ver);// 设置币body.setValuta(parseInt(fsnBytes));// 设置冠字号位body.setCharNum(parseInt(fsnBytes));// 设置冠字StringBuffer no = new StringBuffer();for (int i = 0; i < 12; i++) {int No = parseInt(fsnBytes);if (No != 0)no.append( (char) No);}body.setSno(no.toString());// 设置机具编号StringBuffer machineSNo =new StringBuffer();for (int i = 0; i < 24; i++) {int Msno = parseInt(fsnBytes);if (Msno != 0)machineSNo.append( (char) Msno);}body.setMachineSno( machineSNo.toString());// 设置冠字号保留字body.setReserve1( parseInt(fsnBytes));// System.out.println("时间="+body.getDateStr() + " " +body.getTimeStr()+"|真假币标志="+body.getTfFlag()+"|表示最多3组假币特征码="+body.getErrorCode()+"|"+// "|币种标志="+body.getMoneyFlag()+"|年版或版本号标志="+body.getVer()+"|币值="+body.getValuta()+"|冠字号码字符数="+body.getCharNum()+"|存放识别的冠字号码="+// body.getSno()+"|机具编号="+body.getMachineSno()+"|保留字1="+body.getRecordNum());return body;}public void setHead(byte[] fsnBytes) throws Exception { this.filePos=0; //读取文件头数据的当前指针位置,设置字节位移从0开始if(this.fm==null){this.fm=new FsnModel(this.fsnFilePath);}int[] headStart = new int[4];for (int i = 0; i < 4; i++) {headStart[i] = parseInt(fsnBytes);// System.out.println("headStart["+i+"]="+headStart[i]);}fm.setHeadStart(headStart);int[] headString = new int[6];for (int i = 0; i < 6; i++) {headString[i] = parseInt(fsnBytes);// System.out.println("headString["+i+"] ="+headString[i]);}fm.setHeadString(headString);long counter =parseLong(fsnBytes);// System.out.println("counter="+counter);fm.setCounter(counter);int[] headEnd = new int[4];for (int i = 0; i < 4; i++) {headEnd[i] = parseInt(fsnBytes);// System.out.println("headEnd["+i+"]="+headEnd[i]);}fm.setHeadEnd(headEnd);}public int parseInt(byte[] fsnBytes){intret=(int)FsnTools.demarshallintLittle(fsnBytes,filePos,intstep);this.filePos +=intstep;// System.out.println("this.filePos="+this.filePos+"||ret="+ret);return ret;}public long parseLong(byte[] fsnBytes){longret=FsnTools.demarshallintLittle(fsnBytes,filePos,stringstep);this.filePos +=stringstep;return ret;}public byte[] parseByte(byte[] fsnBytes,int length){byte[] ret=FsnTools.convertByteMarshall(fsnBytes,filePos,length);this.filePos +=length;return ret;}}package bean;public class FsnBody {private String DateStr; //验钞启动日期private String TimeStr; //验钞启动时间/**日期+时间* 指定年月日的日期数据的产生算法为: Date = ((Year-1980)<<9) + (Month<<5) + Day其中:Year为年份,大于等于1980;Month为月份;Day为日;指定时分秒的时间数据产生算法为:Time = (Hour<<11) + (Minute<<5) + (Second>>1)其中:0≤Hour < 24,0≤Minute < 60,0≤Second < 60*/private String DateTime; //验钞启动日期+时间private int TfFlag; //真假币标志,0为假币或可疑币,1为真币,2为残币(清分机适用),3为旧币(清分机适用);private String ErrorCode; //表示最多3组假币特征码(特征码有12种,分别为1,2,3,4,5,6,7,8,9,10,11,12),真币时填0;如果只有一组特征码,把特征码填在ErrorCode[0],则其余两组填0;如果有两组特征码,把特征码填在ErrorCode[0]和ErrorCode[1],剩余的一组填0private String MoneyFlag; //币种标志,最多4位大写ASCII英文字母,不足4位的其余位填0:CNY:人民币private int Ver; //年版或版本号标志;人民币用作年版标志,值填0,1,2,分别代表1990,1999,2005三个年版,可根据实际情况扩充;其余币种填9999(表示不考虑年版);private int Valuta; //币值,最大币值为50000private int CharNum; //冠字号码字符数,指明存储在数组SNo的号码个数;private String Sno; //存放识别的冠字号码,每个数组元素存放一位号码(ASCII 字符),最多12位,不足12位的其余位填0;private String MachineSno; //机具编号,必须为24位,每个数组元素存放一位ASCII字符,不足24位的其余位填0;private int Reserve1; //保留字1private int RecordNum; //冠字号信息在Fsn文件中的行号,从1开始private byte[] ImageBytes; //冠字号信息的图片数据字节数组,保存的原始格式,未转换private String ImgStr; //图片压缩后的字符串private String accNo=""; //冠字号信息产生的账号,Atm等自助存取款机才会有此值public String getDateStr() {return DateStr;}public void setDateStr(String dateStr) {DateStr = dateStr;}public String getTimeStr() {return TimeStr;}public void setTimeStr(String timeStr) {TimeStr = timeStr;}public String getDateTime() {return DateTime;}public void setDateTime(String dateTime) {DateTime = dateTime;}public int getTfFlag() {return TfFlag;}public void setTfFlag(int tfFlag) {TfFlag = tfFlag;}public String getErrorCode() {return ErrorCode;}public void setErrorCode(String errorCode) { ErrorCode = errorCode;}public String getMoneyFlag() {return MoneyFlag;}public void setMoneyFlag(String moneyFlag) { MoneyFlag = moneyFlag;}public int getVer() {return Ver;}public void setVer(int ver) {Ver = ver;}public int getValuta() {return Valuta;}public void setValuta(int valuta) {Valuta = valuta;}public int getCharNum() {return CharNum;}public void setCharNum(int charNum) {CharNum = charNum;}public String getSno() {return Sno;}public void setSno(String sno) {Sno = sno;}public String getMachineSno() {return MachineSno;}public void setMachineSno(String machineSno) { MachineSno = machineSno;}public int getReserve1() {return Reserve1;}public void setReserve1(int reserve1) { Reserve1 = reserve1;}public int getRecordNum() {return RecordNum;}public void setRecordNum(int recordNum) {RecordNum = recordNum;}public byte[] getImageBytes() {return ImageBytes;}public void setImageBytes(byte[] imageBytes) {ImageBytes = imageBytes;}public String getImgStr() {return ImgStr;}public void setImgStr(String imgStr) {ImgStr = imgStr;}public String getAccNo() {return accNo;}public void setAccNo(String accNo) {this.accNo = accNo;}}package bean;import java.util.ArrayList;public class FsnModel implements Comparable<FsnModel>{private int[] headStart; // Fsn文件头起始标志,由4个16比特无符号数据组成,内容为十进制数,分别是20,10,7,26;private int[] headString; // Fsn文件体内容,详情参见<冠字号码文件格式说明.doc>private long counter; // 32比特无符号数值,记录当前冠字号码的记录数。

java文件解析获取方法和方法

java文件解析获取方法和方法

java文件解析获取方法和方法There are multiple ways to parse and retrieve methods from a Java file. One common approach is to use a library like JavaParser, which allows for easy manipulation of Java code. By leveraging the JavaParser library, developers can access the abstract syntax tree (AST) of a Java file, enabling them to extract methods and other code elements programmatically.使用JavaParser这样的库是解析和获取Java文件中方法的常见方法之一。

借助JavaParser库,开发人员可以访问Java文件的抽象语法树(AST),从而使他们能够以编程方式提取方法和其他代码元素。

Another way to parse a Java file for methods is to use regular expressions. Regular expressions can help to identify method signatures and names within the Java file, allowing developers to extract this information for further processing. While this approach may be more manual and error-prone than using a library like JavaParser, it can still be effective in certain scenarios.解析Java文件中的方法的另一种方法是使用正则表达式。

NFS报文分析范文

NFS报文分析范文

NFS报文分析范文NFS(Network File System)是一种在网络上共享文件系统的协议。

它允许多台计算机通过网络连接和共享文件和目录,使得用户可以像访问本地文件一样访问远程文件。

NFS协议采用客户端-服务器的模型,其中客户端是需要访问远程文件的计算机,而服务器则存储和管理文件。

NFS报文是在客户端和服务器之间传输的协议数据单元,用于进行文件访问和操作。

在NFS报文中,最常见的操作类型包括读取文件、写入文件、创建目录、删除文件等。

下面我们将对其中几种常见的操作类型进行分析。

1. 读取文件(Read):客户端向服务器发送一个读取请求,请求读取指定文件的内容。

报文头中包含了操作类型为Read,报文体中包含了读取的文件句柄、读取的起始位置和读取的字节数。

服务器接收到请求后,会读取文件的对应部分内容,并将内容返回给客户端。

2. 写入文件(Write):客户端向服务器发送一个写入请求,请求将指定数据写入到指定文件中。

报文头中包含了操作类型为Write,报文体中包含了写入的文件句柄、写入的起始位置和写入的数据。

服务器接收到请求后,会将数据写入到文件的对应位置。

3. 创建目录(Create):客户端向服务器发送一个创建目录的请求,请求在指定目录下创建一个新的子目录。

报文头中包含了操作类型为Create,报文体中包含了创建的目录路径和权限等信息。

服务器接收到请求后,会在指定目录下创建一个新的子目录,并返回创建结果给客户端。

4. 删除文件(Remove):客户端向服务器发送一个删除文件的请求,请求删除指定的文件。

报文头中包含了操作类型为Remove,报文体中包含了要删除的文件路径。

服务器接收到请求后,会删除指定的文件,并返回删除结果给客户端。

除了以上提到的几种操作类型,NFS协议还支持许多其他操作类型,如重命名文件、列出目录内容、获取文件属性等。

总结起来,NFS报文分析涉及到了报文头和报文体的解析,通过解析报文头可以获取操作类型和相关参数,而解析报文体可以获取操作所需的具体数据。

java中对json进行解析(使用net.sf.json)

java中对json进行解析(使用net.sf.json)

net.sf.json依赖的包很多。

有commons-collections,commons-beanutils.jar,commons-httpclient.jar,commons-lang.jar,ezmorph-1.0.5.jar,morph-1.1.1.jar1./**2.* 从一个JSON 对象字符格式中得到一个java对象,形如:3.* {"id" : idValue, "name" : nameValue, "aBean" : {"aBeanId" : aBeanIdValue, ...}}4.* @param object5.* @param clazz6.* @return7.*/8. public static Object getDTO(String jsonString, Class clazz){9. JSONObject jsonObject = null;10. try{11. setDataFormat2JAVA();12. jsonObject = JSONObject.fromObject(jsonString);13. }catch(Exception e){14. e.printStackTrace();15. }16. return JSONObject.toBean(jsonObject, clazz);17. }18.19./**20.* 从一个JSON 对象字符格式中得到一个java对象,其中beansList是一类的集合,形如:21.* {"id" : idValue, "name" : nameValue, "aBean" : {"aBeanId" : aBeanIdValue, ...},22.* beansList:[{}, {}, ...]}23.* @param jsonString24.* @param clazz25.* @param map 集合属性的类型(key : 集合属性名, value : 集合属性类型clas s) eg: ("beansList" : Bean.class)26.* @return27.*/28. public static Object getDTO(String jsonString, Class clazz, Map map){29. JSONObject jsonObject = null;30. try{31. setDataFormat2JAVA();32. jsonObject = JSONObject.fromObject(jsonString);33. }catch(Exception e){34. e.printStackTrace();35. }36. return JSONObject.toBean(jsonObject, clazz, map);37. }38.39./**40.* 从一个JSON数组得到一个java对象数组,形如:41.* [{"id" : idValue, "name" : nameValue}, {"id" : idValue, "name" : nameValue}, ...]42.* @param object43.* @param clazz44.* @return45.*/46. public static Object[] getDTOArray(String jsonString, Class clazz){47. setDataFormat2JAVA();48. JSONArray array = JSONArray.fromObject(jsonString);49. Object[] obj = new Object[array.size()];50. for(int i = 0; i < array.size(); i++){51. JSONObject jsonObject = array.getJSONObject(i);52. obj[i] = JSONObject.toBean(jsonObject, clazz);53. }54. return obj;55. }56.57./**58.* 从一个JSON数组得到一个java对象数组,形如:59.* [{"id" : idValue, "name" : nameValue}, {"id" : idValue, "name" : nameValue}, ...]60.* @param object61.* @param clazz62.* @param map63.* @return64.*/65. public static Object[] getDTOArray(String jsonString, Class clazz, Map map){66. setDataFormat2JAVA();67. JSONArray array = JSONArray.fromObject(jsonString);68. Object[] obj = new Object[array.size()];69. for(int i = 0; i < array.size(); i++){70. JSONObject jsonObject = array.getJSONObject(i);71. obj[i] = JSONObject.toBean(jsonObject, clazz, map);72. }73. return obj;74. }75./**76.* 从一个JSON数组得到一个java对象集合77.* @param object78.* @param clazz79.* @return80.*/81. public static List getDTOList(String jsonString, Class clazz){82. setDataFormat2JAVA();83. JSONArray array = JSONArray.fromObject(jsonString);84. List list = new ArrayList();85. for(Iterator iter = array.iterator(); iter.hasNext();){86. JSONObject jsonObject = (JSONObject)iter.next();87. list.add(JSONObject.toBean(jsonObject, clazz));88. }89. return list;90. }91.92./**93.* 从一个JSON数组得到一个java对象集合,其中对象中包含有集合属性94.* @param object95.* @param clazz96.* @param map 集合属性的类型97.* @return98.*/99. public static List getDTOList(String jsonString, Class clazz, Map map){ 100. setDataFormat2JAVA();101. JSONArray array = JSONArray.fromObject(jsonString);102. List list = new ArrayList();103. for(Iterator iter = array.iterator(); iter.hasNext();){104. JSONObject jsonObject = (JSONObject)iter.next();105. list.add(JSONObject.toBean(jsonObject, clazz, map));106. }107. return list;108. }109.110./**111.* 从json HASH表达式中获取一个map,该map支持嵌套功能112.* 形如:{"id" : "johncon", "name" : "小强"}113.* 注意commons-collections版本,必须包含mons.collections.map. MultiKeyMap114.* @param object115.* @return116.*/117. public static Map getMapFromJson(String jsonString) {118. setDataFormat2JAVA();119. JSONObject jsonObject = JSONObject.fromObject(jsonString);120. Map map = new HashMap();121. for(Iterator iter = jsonObject.keys(); iter.hasNext();){122. String key = (String)iter.next();123. map.put(key, jsonObject.get(key));124. }125. return map;126. }127.128./**129.* 从json数组中得到相应java数组130.* json形如:["123", "456"]131.* @param jsonString132.* @return133.*/134. public static Object[] getObjectArrayFromJson(String jsonString) {135. JSONArray jsonArray = JSONArray.fromObject(jsonString);136. return jsonArray.toArray();137. }138.139./**140.* 把数据对象转换成json字符串141.* DTO对象形如:{"id" : idValue, "name" : nameValue, ...}142.* 数组对象形如:[{}, {}, {}, ...]143.* map对象形如:{key1 : {"id" : idValue, "name" : nameValue, ...}, key2 : {}, ...}144.* @param object145.* @return146.*/147. public static String getJSONString(Object object) throws Exception{148. String jsonString = null;149.//日期值处理器150. JsonConfig jsonConfig = new JsonConfig();151. jsonConfig.registerJsonValueProcessor(java.util.Date.class, new JsonDateValue Processor());152. if(object != null){153. if(object instanceof Collection || object instanceof Object[]){154. jsonString = JSONArray.fromObject(object, jsonConfig).toString(); 155. }else{156. jsonString = JSONObject.fromObject(object, jsonConfig).toString(); 157. }158. }159. return jsonString == null ? "{}" : jsonString; 160. }。

java解析文件代码

java解析文件代码

java解析文件代码Java解析文件是编写Java应用程序开发过程中非常常见的操作。

它通常被用来读取和操作各种文件类型,如文本文件、XML文件、JSON 文件等。

在本篇文章中,我将通过几个步骤为您详细介绍Java解析文件的操作。

第一步:打开文件在Java中,使用FileInputStream或FileReader打开文件并将其读取到内存中。

在使用FileInputStream时,您可以通过调用read 方法一次读取一个字节,或者调用read(byte[] b, int off, int len)方法一次读取多个字节。

当使用FileReader时,您可以一次读取一个字符或一行字符。

下面是一个示例:```FileInputStream fis = new FileInputStream("file.txt");int content;while ((content = fis.read()) != -1) {// 处理读取到的字节}fis.close();```上述代码将文件"file.txt"一次读取一个字节,并在读取到文件结束符时停止读取。

要一次读取多个字节,请使用以下代码:```byte[] buffer = new byte[1024];int len;while ((len = fis.read(buffer)) != -1) {// 处理读取到的字节数组}```第二步:解析文件内容Java中有多种方式可以解析文件内容,如使用BufferedReader 读取文本文件、使用SAX解析XML、使用GSON解析JSON等。

这里我们以解析JSON为例,使用GSON库来完成。

首先,您需要导入GSON的jar包。

然后,在Java程序中创建以下代码:```Gson gson = new Gson();MyObject obj = gson.fromJson(new FileReader("file.json"), MyObject.class);```上述代码将JSON格式的文件"file.json"解析成Java对象MyObject(MyObject类是您自己定义的Java对象类),使您可以轻松地访问JSON文件中的数据。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//System.out.println("counter =* size"+counter * size);
//System.out.println("fsnHeadLengh="+fsnHeadLengh);
//如果fsn文件的长度合一致
if(counter * size +fsnHeadLengh== fsnbytes.length) {
imgbytes=null;//及时释放图片字节数组对象,释放内}else{
//map.put("ImageSno", null); body.setImageBytes(null);
}
noException=true;
if(noException){//当没有异常时记录解析数据
list.add(body);
body.setDateStr(DateBuf.toString());
body.setTimeStr( TimeBuf.toString());
body.setDateStr(DateBuf.toString());
body.setTimeStr( TimeBuf.toString());
body.setDateTime( body.getDateStr() +" "+ body.getTimeStr());
ArrayList<FsnBody> list =newArrayList<FsnBody>();
longValutaSum=0;
for(inti = 0; i < counter; i++) {
FsnBody body =newFsnBody();
booleannoException=false;//处理过程中没有异常
String TimeStr=hh + ":" + mm+ ":" +ss;
body.setDateStr(DateStr); body.setTimeStr( TimeStr);
//*/
//*
StringBuffer DateBuf=newStringBuffer();
StringBuffer TimeBuf=newStringBuffer();
StringDateStr=StrUtil.numAddZero(String.valueOf((y+1980)),4)+
"-" + StrUtil.numAddZero(String.valueOf(m),2) + "-"+
StrUtil.numAddZero(String.valueOf(d),2);
//设置日期时间
intdata =parseInt(fsnBytes);
inttime = parseInt(fsnBytes);
//System.out.println("data="+data);
//System.out.println("time="+time);
/*if(time<0){
time=-time; }*/
DateBuf.append( y + 1980); DateBuf.append("-");
DateBuf.append( FsnTools.numAddZero(m,2));
DateBuf.append("-");
DateBuf.append( FsnTools.numAddZero(d,2) );
对象,不能将此数据放入map,一是数据量大时内存溢出,二是效率大打折
byte[] imgbytes=FsnTools.byteCopy(fsnbytes, thisPosSart+fsnPerBodyNoImg, size-fsnPerBodyNoImg);
body.setImageBytes(imgbytes);//图片字节数组数据
byte[] fsnbytes =FsnTools.toByteArray(this.fsnFilePath);
this.fm.setSize(fsnbytes.length);
System.out.println("File Lengh: "+fsnbytes.length);
//读取头文件
setHead(fsnbytes);
if (code < 13 && code > 0) {
errorCode += code +",";
}
}
if ("1".equals(map.get("TfFlag")))
errorCode =errorCode.substring(0,
stIndexOf(","));
else
publicfinalstaticintfsnPerBodyImg=1644;//fsn文件体每条记录,包括
图像信息的字节长度
publicintfilePos=0;//fsn文件字节流当前指针位置
publicFsnModelfm;//本实例解析的FsnMedel对象
publicStringfsnFilePath;//FSN文件的存储完整路径,包括文件名
packageaction;
importjava.util.ArrayList;
importtools.FsnTools;
importbean.FsnBody;
importbean.FsnModel;
publicclassFsnReaderAction {
publicfinalstaticintintstep=2;//Uint16字节长度
fsnPerBodyNoImg;
//System.out.println("this.fm.getHeadString()[2]
="+this.fm.getHeadString()[2] );
//System.out.println("counter="+counter);
//System.out.println("size="+size);
body.setRecordNum(i+1);//此条fsn记录在fsn文件中的顺序
ValutaSum +=body.getValuta();
if(size!=fsnPerBodyNoImg){
testSnoImg(fsnbytes);//校验图片数据合法性,如果不合
法,将抛出异
//map.put("ImageSno",imageSno);//图片BufferedImage
//每条fsn信息均从i * size + 32(头的长度)处起始intthisPosSart=i * size +fsnHeadLengh;
//此处处理非常重要,在读取图片文件前一定要做处理因为图片字节流长度固定,644位,getSnoExpImg方法只读到图片信息中有数据部分对应的字节流,后
面的都是空值,将不再读取
}else{
if(this.fm.isPermitException()){//当有异常时,如果
fsn配置文件允许记录异常,则记录,否则不记录
list.add(body); }
} }
this.fm.setBodys(list);
}
}catch(Exception e){
this.fm.setAnalysisExcepted(true);
位图像meta
longmutiall = 4 * width * num;
if(mutiall >fsnPerBodyImg- 108){
thrownewException("图像数据读取失败,图像长度大于图像缓冲器长度");
}
//int i = 0;
//while ( i < width * num) {
if(num<=0||height<=0||width<=0){
thrownewException("图片数据读取失败,长宽和字符数均不能小于等于0");
}
//冠字号码个数不能多于12 if(num>12){
thrownewException("图片数据读取失败,冠字号码个数不能多"); }
//图片大小不能多于图片缓冲区的总大小,减去108位,包括100位其他字段和8
//冠字号码的个数
intnum = parseInt(fsnBytes);
//每个冠字号码的图像宽
intheight = parseInt(fsnBytes);
intwidth = parseInt(fsnBytes);
intReserve2 = parseInt(fsnBytes);
//图片三维不能小于0
//某条图片数据读完以后,filePos不一定会移至这个图片数据对应的结尾位置,要在读取下一条数据时,强制将filePos指向下一条图片信息对应字节流起
始位置
if(filePos<thisPosSart){
filePos=thisPosSart;
}
body = getSnoExpImg(fsnbytes);
longcounter =this.fm.getCounter();//冠字号信息条数//
相关文档
最新文档