java解析FSN文件
- 格式:doc
- 大小:35.55 KB
- 文档页数:14
java解析csv文件科学计算法摘要:1.Java 解析CSV 文件的重要性2.Java 解析CSV 文件的方法3.科学计算法在Java 解析CSV 文件中的应用4.总结正文:Java 解析CSV 文件的重要性随着数据处理的需求不断增长,CSV 文件作为一种常用的数据存储格式,被广泛应用于各种场景中。
然而,CSV 文件中的数据往往需要进行解析和处理,才能被程序所使用。
Java 作为一种广泛应用的编程语言,提供了一系列方法来解析CSV 文件。
本文将详细介绍Java 解析CSV 文件的方法,并以科学计算法为例,探讨其在Java 解析CSV 文件中的应用。
Java 解析CSV 文件的方法Java 中,有多种方法可以解析CSV 文件。
常用的方法包括:1.使用BufferedReader 和FileReader:这种方法简单易用,但是需要手动处理分隔符和换行符。
2.使用Apache Commons CSV 库:这是一个功能强大且易用的第三方库,可以方便地处理CSV 文件。
3.使用OpenCSV 库:这是一个开源的CSV 处理库,提供了丰富的API,支持多种解析和写入方式。
科学计算法在Java 解析CSV 文件中的应用科学计算法(如矩阵运算、线性代数等)在许多领域都有广泛的应用。
在Java 解析CSV 文件的过程中,科学计算法可以帮助我们更高效地处理数据。
例如,通过使用矩阵运算,可以快速地对CSV 文件中的数据进行分析和处理;通过线性代数方法,可以简化数据解析的过程,提高解析效率。
总结本文介绍了Java 解析CSV 文件的重要性,以及Java 解析CSV 文件的方法。
通过使用科学计算法,可以在Java 解析CSV 文件的过程中更高效地处理数据。
java fastjson用法Fastjson是一个Java语言编写的高性能的JSON解析库,具有速度快、功能强大和易于使用等优点。
它支持将Java对象转换为JSON字符串,以及将JSON字符串转换为Java对象。
下面是关于Java Fastjson用法的介绍:1. 导入Fastjson库:首先,需要将Fastjson库导入到项目中。
可以在项目的构建文件(如pom.xml)中添加Fastjson的依赖配置,或者手动下载并导入Fastjson 的jar文件。
2. 将Java对象转换为JSON字符串:使用Fastjson可以将Java对象快速转换为JSON字符串。
可以通过调用Fastjson的toJSONString()方法,将Java对象转换为对应的JSON字符串。
例如:```User user = new User("John", 25);String jsonStr = JSON.toJSONString(user);System.out.println(jsonStr);```上述代码将创建一个名为"John",年龄为25的User对象,并将其转换为JSON字符串。
3. 将JSON字符串转换为Java对象:Fastjson还可以将JSON字符串转换为Java对象。
可以通过调用Fastjson的parseObject()方法,将JSON字符串转换为对应的Java对象。
例如:```String jsonStr = "{\"name\":\"John\",\"age\":25}";User user = JSON.parseObject(jsonStr, User.class);System.out.println(user.getName());System.out.println(user.getAge());```上述代码将从JSON字符串中解析出用户的姓名和年龄,并将其存储在User 对象中。
java中fastjson⽣成和解析json数据(序列化和反序列化数据)本⽂讲解2点:1. fastjson⽣成和解析json数据(举例:4种常⽤类型:JavaBean,List<JavaBean>,List<String>,List<Map<String,Object>)2.通过⼀个android程序测试fastjson的⽤法。
fastjson简介:⼀. fastjson⽣成json字符串(JavaBean,List<JavaBean>,List<String>,List<Map<String,Object>)String jsonStrng = JSON.toJSONString(object);⼆. fastjson 解析json字符串为四种类型1. JavaBeanPerson person = JSON.parseObject(jsonString, Person.class);2. List<JavaBean>List<Person> listPerson =JSON.parseArray(jsonString, Person.class);3. List<String>List<String> listString = JSON.parseArray(jsonString, String.class);4. List<Map<String,Object>>复制代码代码如下:List<Map<String, Object>> listMap = JSON.parseObject(jsonString, new TypeReference<List<Map<String,Object>>>(){}); (注意:此处可看出fastjson反射机制⽐gson更准确, id = 1001 通过fastjson反射仍是 id = 1001 , ⽽通过gson反射结果为 id =1001.0 ,JSON解析器fastjson(阿⾥巴巴出品,版本1.1.26),如果定义了JSONObject为{"JACKIE_ZHANG":"张学友","ANDY_LAU":"刘德华","LIMING":"黎明","Aaron_Kwok":"郭富城"},那么读取值时,KEY顺序⽆序,测试代码:import comalibabafastjsonJSONObject;/*** Created by wangzhenfei on 14-4-*/public class FastJsonTest {public static void main(String[] args){String jsonStr = "{\"JACKIE_ZHANG\":\"张学友\",\"ANDY_LAU\":\"刘德华\",\"LIMING\":\"黎明\",\"Aaron_Kwok\":\"郭富城\"}" ;//做5次测试for(int i=0,j=5;i<j;i++){JSONObject jsonObject = JSONObjectparseObject(jsonStr) ;for(javautilMapEntry<String,Object> entry:jsonObjectentrySet()){Systemoutprint(entrygetKey()+"-"+entrygetValue()+"\t");}Systemoutprintln();//⽤来换⾏}}}运⾏结果:LIMING-黎明 Aaron_Kwok-郭富城JACKIE_ZHANG-张学友ANDY_LAU-刘德华Aaron_Kwok-郭富城 ANDY_LAU-刘德华LIMING-黎明JACKIE_ZHANG-张学友Aaron_Kwok-郭富城 JACKIE_ZHANG-张学友ANDY_LAU-刘德华LIMING-黎明LIMING-黎明 ANDY_LAU-刘德华JACKIE_ZHANG-张学友Aaron_Kwok-郭富城JACKIE_ZHANG-张学友 LIMING-黎明ANDY_LAU-刘德华Aaron_Kwok-郭富城解决办法:定义为JSONArray,代码如下:import comalibabafastjsonJSONArray;/*** Created by wangzhenfei on 14-4-*/public class FastJsonTest {public static void main(String[] args){String jsonStr = "[{\"JACKIE_ZHANG\":\"张学友\"},{\"ANDY_LAU\":\"刘德华\"},{\"LIMING\":\"黎明\"},{\"Aaron_Kwok\":\"郭富城\"}]" ;//做5次测试for(int i=0,j=5;i<j;i++){JSONArray jsonArray = JSONArrayparseArray(jsonStr);for(int k=0;k<jsonArraysize();k++){Systemoutprint(jsonArrayget(k) + "\t");}Systemoutprintln();//⽤来换⾏}}}运⾏结果为:{"JACKIE_ZHANG":"张学友"} {"ANDY_LAU":"刘德华"}{"LIMING":"黎明"}{"Aaron_Kwok":"郭富城"}{"JACKIE_ZHANG":"张学友"} {"ANDY_LAU":"刘德华"}{"LIMING":"黎明"}{"Aaron_Kwok":"郭富城"}{"JACKIE_ZHANG":"张学友"} {"ANDY_LAU":"刘德华"}{"LIMING":"黎明"}{"Aaron_Kwok":"郭富城"}{"JACKIE_ZHANG":"张学友"} {"ANDY_LAU":"刘德华"}{"LIMING":"黎明"}{"Aaron_Kwok":"郭富城"}{"JACKIE_ZHANG":"张学友"} {"ANDY_LAU":"刘德华"}{"LIMING":"黎明"}{"Aaron_Kwok":"郭富城"}如果就想要定义为JSONObject,⽽不是JSONArray,可以选⽤其他JSON解析器,个⼈推荐使⽤google的gson,⽂档明显⽐fastjson好很多(从这⾥可以看出阿⾥巴巴和⾕歌的差距):import comgooglegsonJsonElement;import comgooglegsonJsonObject;import comgooglegsonJsonParser;/*** Created by wangzhenfei on 14-4-*/public class FastJsonTest {public static void main(String[] args){String jsonStr = "{\"JACKIE_ZHANG\":\"张学友\",\"ANDY_LAU\":\"刘德华\",\"LIMING\":\"黎明\",\"Aaron_Kwok\":\"郭富城\"}" ;//做5次测试for(int i=0,j=5;i<j;i++){JsonObject jsonObject = (JsonObject) new JsonParser()parse(jsonStr);for(javautilMapEntry<String,JsonElement> entry:jsonObjectentrySet()){Systemoutprint(entrygetKey()+"-"+entrygetValue()+"\t");}Systemoutprintln();//⽤来换⾏}}}运⾏结果:JACKIE_ZHANG-"张学友" ANDY_LAU-"刘德华" LIMING-"黎明" Aaron_Kwok-"郭富城"JACKIE_ZHANG-"张学友" ANDY_LAU-"刘德华" LIMING-"黎明" Aaron_Kwok-"郭富城"JACKIE_ZHANG-"张学友" ANDY_LAU-"刘德华" LIMING-"黎明" Aaron_Kwok-"郭富城"JACKIE_ZHANG-"张学友" ANDY_LAU-"刘德华" LIMING-"黎明" Aaron_Kwok-"郭富城"JACKIE_ZHANG-"张学友" ANDY_LAU-"刘德华" LIMING-"黎明" Aaron_Kwok-"郭富城"以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
java解析报文代码一、什么是报文解析?在网络通信中,报文是信息交流的基本单位。
报文解析是指将接收到的报文按照预定的规则进行解析和处理的过程。
报文解析在很多应用场景中都非常重要,比如网络协议解析、数据传输解析等。
二、Java解析报文的基本流程Java是一种跨平台的编程语言,在报文解析过程中,Java提供了丰富的库和工具,使得解析报文变得更加简单和高效。
下面是Java解析报文的基本流程:1. 获取报文数据:首先,需要从网络或文件中获取报文的原始数据。
可以使用Java提供的网络编程功能或文件IO操作来获取报文数据。
2. 报文解析:获取到报文数据后,需要按照报文的格式和规则进行解析。
这个过程需要根据具体的报文格式进行解析,可以使用Java 提供的字符串处理、正则表达式、XML解析等功能来完成。
3. 数据处理:解析报文后,会得到报文中的各个字段和数据。
根据业务需求,可以对这些数据进行进一步处理,比如计算、存储、展示等。
三、使用Java解析报文的代码实现下面通过一个示例来演示如何使用Java解析报文。
假设有一个报文格式如下:```{"name": "张三","age": 20,"address": "北京市"}```我们需要将这个报文解析成Java对象,并获取其中的字段值。
代码如下:```javaimport com.alibaba.fastjson.JSONObject;public class MessageParser {public static void main(String[] args) {// 假设报文数据已经获取到String message = "{\"name\":\"张三\",\"age\":20,\"address\":\"北京市\"}";// 解析报文JSONObject jsonObj = JSONObject.parseObject(message);// 获取字段值String name = jsonObj.getString("name");int age = jsonObj.getIntValue("age");String address = jsonObj.getString("address");// 打印字段值System.out.println("姓名:" + name);System.out.println("年龄:" + age);System.out.println("地址:" + address);}}```在上述代码中,我们使用了阿里巴巴的fastjson库来解析JSON格式的报文。
java程序读取服务器端数据文件的方法Java作为一种高级的面向对象的编程语言,具有广泛的应用前景,尤其是作为服务器端语言时,其功能也越来越强大。
本文以“Java 程序读取服务器端数据文件的方法”为标题,介绍如何使用Java进行服务器端数据文件的读取。
首先,不管是什么样的服务器,它都会存储有关用户信息和应用程序配置信息的数据文件。
Java虚拟机提供了各种API来读取并解析这些文件,这样,我们可以从中获取所需的信息。
一般来说,从服务器端读取数据文件需要三个步骤:1.连接服务器:首先,我们必须建立与服务器的连接,这通过使用Socket类来实现,我们可以调用Socket的构造方法来建立连接,如下所示:Socket socket = new Socket(hostName, port);2.读取数据文件:然后,我们可以使用InputStream类来读取服务器端的数据文件,代码如下所示:InputStream inputStream = s.getInputStream();3.解析数据文件:最后,我们可以通过Java编程解析读取到的文件,比如,若要读取XML文件,可以使用JAXP解析器,代码如下所示:DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document doc = builder.parse(inputStream);除了XML文件,还可以使用Java提供的其他工具来解析和读取其他格式的文件,比如JSON、CSV等。
此外,在实际项目中,可以使用现成的Java框架来读取服务器端的数据文件,比如:Jackson、Gson等,只需要调用相应的方法就可以方便快捷地读取服务器端的数据文件了。
综上所述,通过Java编程可以实现从服务器端读取数据文件的功能,无论是使用原生的Java API还是使用框架,都可以满足我们的需求,从而更好地提高程序的可读性和可维护性。
java bin码解析Java bin码解析指的是将数据从二进制格式转换为Java对象的过程。
在Java中,使用ObjectInputStream类读取二进制数据,并将其转换为Java对象。
下面我们来详细了解一下Java bin码解析的过程。
Java bin码解析的过程包括以下步骤:1.创建输入流在Java中,可以使用FileInputStream或ByteArrayInputStream来创建输入流。
一般情况下,我们会从文件或网络中读取二进制数据,因此使用FileInputStream来创建输入流。
2.创建对象输入流在Java中,使用ObjectInputStream类来读取二进制数据。
因此,我们需要在创建输入流之后,使用ObjectInputStream类将其封装为对象输入流。
3.读取对象当我们创建好对象输入流之后,就可以使用其提供的readObject()方法来读取对象。
该方法会从输入流中读取二进制数据,并将其转换为Java对象。
4.关闭输入流读取完对象之后,我们需要关闭输入流,以释放系统资源。
以上便是Java bin码解析的过程,其代码实现如下:import java.io.FileInputStream;import java.io.IOException;import java.io.ObjectInputStream;public class BinaryDecoder {public static Object decode(String fileName) throws IOException, ClassNotFoundException {Object result = null;FileInputStream fis = null;ObjectInputStream ois = null;try {fis = new FileInputStream(fileName);ois = new ObjectInputStream(fis);result = ois.readObject();} finally {if (ois != null) {ois.close();}if (fis != null) {fis.close();}}return result;}}在上述代码中,我们封装了一个decode()方法,该方法接收一个文件名作为参数,并返回解析后的Java对象。
java 域名解析方法Java中可以使用多种方法来解析域名,以下是其中两种常见的方法:1. 使用Java内置的DNS解析器Java内置了一个DNS解析器,可以使用它来解析域名并返回相应的IP地址。
以下是使用Java DNS解析器的示例代码:```javaimport .InetAddress;import .UnknownHostException;public class DomainResolver {public static void main(String[] args) {String domainName = "域名";try {InetAddress inetAddress = InetAddress.getByName(domainName);System.out.println("IP address of " + domainName + " is: " + inetAddress.getHostAddress());} catch (UnknownHostException e) {System.out.println("Domain " + domainName + " is not found.");}}}```在上述示例中,我们使用`InetAddress.getByName()`方法来解析域名并返回相应的IP地址。
如果域名不存在,则会抛出`UnknownHostException`异常。
2. 使用第三方库:JDNSJDNS是一个开源的Java DNS解析库,它支持多种DNS查询类型,并可以与本地操作系统中的DNS配置无缝集成。
以下是使用JDNS解析域名的示例代码:首先需要在项目中添加JDNS的依赖:```xml<dependency><groupId>dnsjava</groupId><artifactId>dnsjava</artifactId><version>3.4.2</version></dependency>```然后可以编写如下代码:```javaimport org.xbill.DNS.*;public class DomainResolver {public static void main(String[] args) {String domainName = "域名;try {Lookup lookup = new Lookup(domainName, Type.A); // 查询A记录Record[] records = lookup.run(); // 执行查询并获取结果if (records != null && records.length > 0) {for (Record record : records) {if (record instanceof ARecord) { // 只处理A记录ARecord aRecord = (ARecord) record;System.out.println("IP address of " + domainName + " is: " + aRecord.getAddress().getHostAddress());}}} else {System.out.println("Domain " + domainName + " is not found.");}} catch (TextParseException e) {System.out.println("Error parsing DNS response.");} catch (TimeoutException e) {System.out.println("DNS query timed out.");} catch (NamingException e) {System.out.println("Error in DNS naming.");} catch (IOException e) {System.out.println("Error in DNS communication.");} catch (Exception e) { // 处理其他异常情况,例如DNS服务器异常等。
java iinarchive.extract 方法解析一、概述在Java中,`inarchive.extract`方法用于从归档文件中提取文件。
归档文件是一种包含多个文件的压缩文件,常见的归档格式包括ZIP、TAR等。
`inarchive.extract`方法提供了一种方便的方式来解压缩归档文件,从而可以方便地访问其中的文件。
二、方法解析1. 语法结构`inarchive.extract(String archivePath, String destinationDir)`* `archivePath`:归档文件的路径,可以是绝对路径或相对路径。
* `destinationDir`:提取文件的目录路径。
例如:`inarchive.extract("C:/archive.zip","C:/extractedFolder")`2. 参数说明* `archivePath`:必填参数,指定要解压缩的归档文件的路径。
可以是相对路径或绝对路径,如果提供了相对路径,则归档文件相对于当前工作目录进行解压缩。
* `destinationDir`:可选参数,指定提取文件的目录路径。
如果不提供该参数,则默认在当前工作目录下创建一个名为“extracted”的目录进行提取。
3. 返回值该方法没有返回值(void)。
4. 异常处理在调用`inarchive.extract`方法时,可能会抛出异常,如文件找不到异常(FileNotFoundException)、权限不足异常(PermissionDeniedException)等。
因此,需要做好异常处理,确保在解压缩过程中能够正确处理各种可能出现的错误情况。
三、使用示例下面是一个简单的使用示例:```javaimport inarchive.*;public class ArchiveExtractor {public static void main(String[] args) {String archivePath = "C:/archive.zip";String destinationDir = "C:/extractedFolder";try {inarchive.extract(archivePath, destinationDir);System.out.println("Archive extraction completed successfully.");} catch (Exception e) {System.err.println("Error during archive extraction: " + e.getMessage());}}}```四、注意事项* 在解压缩过程中,需要确保有足够的权限访问归档文件和目标目录。
JSch-Java实现的SFTP(⽂件下载详解篇)上⼀篇讲述了使⽤JSch实现⽂件上传的功能,这⼀篇主要讲述⼀下JSch实现⽂件下载的功能。
并介绍⼀些SFTP的辅助⽅法,如cd,ls等。
同样,JSch的⽂件下载也⽀持三种传输模式:OVERWRITE, RESUME和APPEND,请参考上篇随笔:JSch⽂件下载是通过调⽤ChannelSftp对象的get⽅法来实现的。
ChannelSftp中有9个get⽅法的重载⽅法:publicvoid get(String src, String dst)将⽬标服务器上⽂件名为src的⽂件下载到本地,本地⽂件名为dst。
若dst为⽬录,则下载到本地的⽂件名将与src⽂件名相同。
(注:src必须是⽂件,不能为⽬录)采⽤默认的传输模式:OVERWRITEpublicvoid get(String src, String dst, SftpProgressMonitor monitor)将⽬标服务器上⽂件名为src的⽂件下载到本地,本地⽂件名为dst。
若dst为⽬录,则下载到本地的⽂件名将与src⽂件名相同。
(注:src必须是⽂件,不能为⽬录)采⽤默认的传输模式:OVERWRITE并使⽤实现了SftpProgressMonitor接⼝的monitor对象来监控⽂件的传输进度。
publicvoid get(String src, String dst,SftpProgressMonitor monitor, int mode)将⽬标服务器上⽂件名为src的⽂件下载到本地,本地⽂件名为dst。
若dst为⽬录,则下载到本地的⽂件名将与src⽂件名相同。
(注:src必须是⽂件,不能为⽬录)指定⽂件传输模式为mode(mode可选值为:ChannelSftp.OVERWRITE,ChannelSftp.RESUME,ChannelSftp.APPEND)并使⽤实现了SftpProgressMonitor接⼝的monitor对象来监控⽂件的传输进度。
java 证书解析在Java中,可以通过KeyStore类和Certificate类来解析证书。
首先,需要加载证书存储文件。
可以使用KeyStore类的load方法来加载证书存储文件。
示例代码如下:```javaKeyStore keyStore = KeyStore.getInstance("JKS"); FileInputStream fis = new FileInputStream("path/to/keystore.jks"); keyStore.load(fis, "password".toCharArray());```然后,可以通过KeyStore类的getCertificate方法来获取指定证书的证书对象。
示例代码如下:```javaCertificate certificate = keyStore.getCertificate("alias");```获取到证书对象后,可以调用相应的方法获取证书的信息。
例如,可以使用Certificate类的getSubjectDN方法获取证书的主题信息。
示例代码如下:```javaX500Principal subjectDN = certificate.getSubjectX500Principal(); System.out.println("Subject DN: " + subjectDN.getName());```在以上代码中,使用X500Principal类来表示证书的主题信息。
类似地,可以使用Certificate类的其他方法来获取证书的其他信息,如颁发者信息、有效期等。
需要注意的是,以上示例假设证书存储文件的类型为JKS,并且使用口令来保护证书存储文件。
实际使用时,可能需要根据具体的情况做相应的调整。
Java按位置解析⽂本⽂件(使⽤Swing选择⽂件)⼯作中遇到这样的⼀个需求,按位置解析⼀些⽂本⽂件,它们由头部、详情、尾部组成,并且每⼀⾏的长度可能不⼀样,每⼀⾏代表的意思也可能不⼀样,但是每⼀⾏各个位置代表的含义已经确定了。
例如有下⾯这样⼀段⽂本:H1201504280222D1000001TYPE12000000000002D20001DATA13T10334每⼀⾏的前两位决定了这⼀⾏各个位置代表的含义,例如以H1开关的第3位到第10位代表⽇期,尽管可以按照⽂档⼀⾏⼀⾏的对照来了解它们的含义,但这样不是⼀种折磨?经过⼀个⼩⼯具处理后,输出HTML⽂件,⽤浏览器打开后,展⽰如下:是不是看着稍微舒服些了呢?要实现的⼏个功能1. 可通过下拉框选择不同类型的⽂件2. 使⽤Swing选择⽂件再进⾏处理3. 易于扩展(可通过配置⽂件添加新的⽂件类型,⽽不需要更改Java代码)相关实现运⾏截图如下:1.⾸先读取配置,将能处理的⽂件类型显⽰在下拉框中通过file_list_config.properties⽂件进⾏配置:test=Test File需要有test.properties⽂件来定义有哪些不同的⾏:H1=folder/Header.xmlD1=folder/Detail1.xmlD2=folder/Detail2.xmlT1=folder/Trailer.xml⽽Header.xml代表⽤来定义以H1开头的⾏:<?xml version="1.0" encoding="UTF-8"?><bean><field length="2">Flag</field><field length="8">Date</field><field length="4">Type</field></bean>由于swing可的下拉框JComboBox不直接⽀持HTML中的key value对,可以像下⾯这样初始化:// initial JComboBoxprivate JComboBox<FileItem> jSelect = new JComboBox<FileItem>();.........// define FileItempublic class FileItem {private String key;private String value;..........@Overridepublic String toString() {return value;}}// 填充下拉框fileList = ResourceFactory.getSington().getFileItemList();for (FileItem item : fileList) {jSelect.addItem(item);}下⾯代码中 getFileItemList 是通过读取配置⽂件,返回⼀个 List 的结果集, 由于在 JComboBox 中展⽰的⽂本它会调⽤FileItem的toString进⾏输出,所以需要重写toString⽅法。
Java实现解析ini⽂件对应到JavaBean中⽬录1、ini⽂件简介2、ini⽂件3、ini解析⼯具类4、⽰例运⾏结果1、ini⽂件简介.ini ⽂件是Initialization File的缩写,即初始化⽂件,是windows的系统配置⽂件所采⽤的存储格式,统管windows的各项配置,ini⽂件也可以⽤来存放软件信息,在java开发当中有时候涉及到对接别的设备或者对接程序可能偶尔会遇到ini⽂件。
2、ini⽂件这个是我的⼀个ini⽂件。
现在想要解析这个⽂件,对应到javabean当中,从下⾯可以看出,这个ini有两个节点,也可以认为是两个java对象,⼀个是PATIENT,⼀个是REPORT。
这个是已经写好的⼀个⼯具类,可以直接复制粘贴使⽤的,没有依赖任何第三⽅jar包,在⼯具类最下⾯有⼀个main⽅法,就是⽤法⽰例。
3、ini解析⼯具类import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.util.HashMap;import java.util.Map;import java.util.Properties;public class ParseIniUtil {protected Map<String,Object> sections = new HashMap<String,Object>();private transient String defaultName = "default";private transient String sectionName;private transient Properties property;private Properties parentObj;/*** 构造函数** @param filename* ⽂件路径* @throws IOException*/public ParseIniUtil(String filename) throws IOException {BufferedReader reader = new BufferedReader(new FileReader(filename));read(reader);reader.close();}/*** ⽂件读取** @param reader* @throws IOException*/protected void read(BufferedReader reader) throws IOException {String line;sectionName = this.defaultName;property = new Properties();sections.put(sectionName, property);while ((line = reader.readLine()) != null) {parseLine(line);}}/*** 解析每⾏数据** @param line*/protected void parseLine(String line) {line = line.trim();if (line.indexOf('#') == 0 || line.indexOf(';') == 0) {return;}if (line.matches("\\[.*\\]")) {sectionName = line.replaceFirst("\\[(.*)\\]", "$1").trim();property = new Properties();if (sectionName.matches(".*:.*")) {int pos = sectionName.indexOf(':');String child = sectionName.substring(0, pos);String parent = sectionName.substring(pos + 1);parentObj = this.getSection(parent);if (parentObj != null) {property = (Properties) parentObj.clone();sections.put(child, property);}} else {sections.put(sectionName, property);}} else if (line.matches(".*=.*")) {int i = line.indexOf('=');String name = line.substring(0, i).trim();String value = line.substring(i + 1).trim();if (value.indexOf('"') == 0 || value.indexOf('\'') == 0) {// 去掉前⾯符号 " 或 'value = value.substring(1, value.length());// 去掉后⾯ " 或 'int len = value.length();if (value.indexOf('"') == len - 1 || value.indexOf('\'') == len - 1) { value = value.substring(0, len - 1);}}property.setProperty(name, value);}}/*** 根据节和 key 获取值** @param section* @param key* @return String*/public String get(String section, String key) {if (section.equals(null) || section == "")section = this.defaultName;Properties property = (Properties) sections.get(section);if (property == null) {return null;}String value = property.getProperty(key);if (value == null)return null;return value;}/*** 获取节下所有key** @param section* @return Properties*/public Properties getSection(String section) {if (section.equals(null) || section == "")section = this.defaultName;Properties property = (Properties) sections.get(section);if (property == null) {sections.put(section, property);}return property;}/*** 增加节点及值** @param section*/public void set(String section, String key, String value) {if (property == null)property = new Properties();if (section.equals(null) || section == "")section = this.defaultName;if (key.equals(null) || key == "") {System.out.println("key is null");return;}sections.put(section, property);property.setProperty(key, value);}/*** 增加节点** @param section*/public void setSection(String section) {sections.put(section, property);}public static void main(String[] args) {String fileName = "C:\\Users\\gxs\\Desktop\\Patient.ini";ParseIniUtil config = null;try {config = new ParseIniUtil(fileName);} catch (IOException e) {e.printStackTrace();}String app = config.get("PATIENT", "OrderID");System.out.println("OrderID = " + app);String app1 = config.get("REPORT", "PostCode");System.out.println("PostCode = " + app1);}}4、⽰例运⾏结果有了这个应该想要解析ini对应到javabean当中不是什么问题了吧。
Java 解析stunnel文件,动态增删改下面的是一个stunnel.conf文件; Sample stunnel configuration file for Win32 by Michal Trojnara 2002-2012; Some options used here may be inadequate for your particular configuration; This sample file does *not* represent stunnel.conf defaults; Please consult the manual for detailed description of available options; ************************************************************************** ; * Global options * ; **************************************************************************; Debugging stuff (may useful for troubleshooting);debug = 7;output = stunnel.log; Disable FIPS mode to allow non-approved protocols and algorithms;fips = no; ************************************************************************** ; * Service defaults may also be specified in individual service sections *; **************************************************************************; Certificate/key is needed in server mode and optional in client modecert = stunnel.pem;key = stunnel.pem; Authentication stuff needs to be configured to prevent MITM attacks; It is not enabled by default!;verify = 2; Don't forget to c_rehash CApath;CApath = certs; It's often easier to use CAfile;CAfile = certs.pem; Don't forget to c_rehash CRLpath;CRLpath = crls; Alternatively CRLfile can be used;CRLfile = crls.pem; Disable support for insecure SSLv2 protocoloptions = NO_SSLv2; Workaround for Eudora bug;options = DONT_INSERT_EMPTY_FRAGMENTS; These options provide additional security at some performance degradation;options = SINGLE_ECDH_USE;options = SINGLE_DH_USE; ************************************************************************** ; * Service definitions (at least one service has to be defined) *; ************************************************************************** ; Example SSL server mode services[pop3s]accept = 995connect = 110[imaps]accept = 993connect = 143[ssmtp]accept = 465connect = 25; Example SSL client mode services;[gmail-pop3];client = yes;accept = 127.0.0.1:110;connect = :995;[gmail-imap];client = yes;accept = 127.0.0.1:143;connect = :993;[gmail-smtp];client = yes;accept = 127.0.0.1:25;connect = :465; Example SSL front-end to a web server;[https];accept = 9999;connect = 192.168.160.94:8888; "TIMEOUTclose = 0" is a workaround for a design flaw in Microsoft SSL ; Microsoft implementations do not use SSL close-notify alert and thus ; they are vulnerable to truncation attacks;TIMEOUTclose = 0; vim:ft=dosiniimport java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.util.HashMap;import java.util.Map;public class ModifyConfFile{// 默认节点private static String GLOBLE_CONFIG = "__globle";// 默认注释符号private String[] comments = {"#",";"};// 判断此行是否是注释行private boolean isComment(String line){for (String comment : comments){if (line.startsWith(comment)){return true;}}return false;}// 行开始是否用[]框起来的private boolean isSection(String line){return line.startsWith("[") && line.indexOf("]") > 0;}public static void main(String[] args) throws IOException{String path = "F:/stunnel222.conf";FileReader fr = new FileReader(path);BufferedReader br = new BufferedReader(fr,20480);//FileWriter fw = new FileWriter(path,false);//BufferedWriter bw = new BufferedWriter(fw,20480);String s = null;String content = "";ModifyConfFile m = new ModifyConfFile() ;// 用来存放配置文件中的内容Map<String, Map<String, String>> configMap = new HashMap<String, Map<String, String>>();Map<String, String> inMap = new HashMap<String, String>();Map<String, String> inMap2 = new HashMap<String, String>();configMap.put(GLOBLE_CONFIG, inMap);// 按行读取,将内容存入map中while((s = br.readLine()) != null){if(m.isComment(s)){continue;}else if(m.isSection(s)){String section = s.substring(1, s.indexOf("]"));if (configMap.containsKey(section)){inMap = configMap.get(section);}else{inMap = new HashMap<String, String>();configMap.put(section, inMap);}}else{int index = s.indexOf("=");String key = s;String val = null;if (index != -1){key = s.substring(0, index);val = s.substring(index + 1);}if("".equals(s) || s == null){inMap = configMap.get(GLOBLE_CONFIG);}if(!"".equals(s) && s != null){inMap.put(key == null ? key : key.trim(), val == null ? val : val.trim());}}content += s +"\r\n";}System.out.println(content);System.out.println("=============================================================");// 获取[luweiwei]的节点下的mapMap<String, String> tempMap = configMap.get("luweiwei");// 修改[luweiwei]的节点下的map中的connect对应的valuetempMap.put("connect", "192.168.4.185:8081");configMap.put("luweiwei", tempMap);String newContent ="";for (Map.Entry<String, Map<String, String>> entry : configMap.entrySet()) {if(GLOBLE_CONFIG.equals(entry.getKey())){for (Map.Entry<String, String> entry2 : entry.getValue().entrySet()) {newContent = newContent + entry2.getKey() + "=" + entry2.getValue() + "\r\n";}newContent += "\r\n";}else{newContent += "["+entry.getKey()+"]"+"\r\n";for (Map.Entry<String, String> entry2 : entry.getValue().entrySet()) {newContent = newContent + entry2.getKey() + "=" + entry2.getValue() + "\r\n";}newContent += "\r\n";}}System.out.println(newContent);System.out.println("=============================================================");// 写进stunnel.conf文件中去FileWriter fw = new FileWriter(path,false);BufferedWriter bw = new BufferedWriter(fw,20480);bw.write(newContent);bw.flush();// 打印查看修改后的内容content = "";String path2 = "F:/stunnel222.conf";FileReader fr2 = new FileReader(path2);BufferedReader br2 = new BufferedReader(fr2,20480);while((s = br2.readLine()) != null){content += s +"\r\n";}System.out.println(content);}}。
java解析proto文件的方法在Java中解析proto文件需要使用第三方库,例如Google的Protocol Buffers库。
Protocol Buffers是一种语言无关、平台无关、可扩展的序列化数据结构的协议,它可以用于数据存储、通信协议等多种场景。
下面是使用Protocol Buffers库解析proto文件的方法:1. 导入依赖首先需要在项目中导入Protocol Buffers库的依赖。
可以通过Maven或Gradle等构建工具进行导入。
以使用Maven为例,在pom.xml文件中添加以下依赖:```xml<dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java</artifactId><version>3.17.0</version></dependency>```2. 编写proto文件在解析proto文件之前,首先需要编写一个proto文件。
proto 文件使用类似于C语言的语法定义了数据结构和相关协议。
例如,下面是一个简单的proto文件示例:```protosyntax = "proto3";message Person {string name = 1;int32 age = 2;repeated string interests = 3;}```以上proto文件定义了一个名为Person的message,包含了name、age和interests三个字段。
3. 使用protoc编译proto文件在编写完proto文件后,需要使用protoc编译器将其编译成Java代码。
可以通过命令行执行以下命令来完成编译:```protoc --java_out=输出目录 proto文件路径```其中,--java_out参数指定输出目录,proto文件路径为待编译的proto文件路径。
java 命令行解析Java命令行解析一、什么是命令行解析?命令行解析是指通过命令行执行Java程序时,对输入的命令行参数进行解析和处理的过程。
Java提供了一些工具类和方法,可以方便地实现命令行解析。
二、为什么需要命令行解析?在实际开发中,我们经常需要从命令行获取一些配置参数或者用户输入的数据。
通过命令行解析,我们可以方便地获取用户输入的参数,并根据不同的参数进行不同的处理。
三、Java命令行解析的方法1. 使用args数组Java程序在命令行执行时,可以通过参数args获取命令行传递的参数。
args是一个字符串数组,其中每个元素表示一个参数。
我们可以通过遍历args数组来获取每个参数的值。
例如,我们可以通过以下命令执行Java程序,并传递参数:java MyClass param1 param2在Java程序中,可以通过args数组获取参数的值:String param1 = args[0];String param2 = args[1];2. 使用Apache Commons CLIApache Commons CLI是一个开源的命令行解析库,提供了丰富的功能和灵活的配置选项。
使用Apache Commons CLI,我们可以轻松地实现复杂的命令行解析。
我们需要在项目中引入Apache Commons CLI的依赖。
然后,可以通过创建Options对象来配置命令行选项,并使用CommandLineParser来解析命令行参数。
下面是一个示例代码:import mons.cli.*;public class MyClass {public static void main(String[] args) {Options options = new Options();options.addOption("h", "help", false, "显示帮助信息");options.addOption("v", "version", false, "显示版本信息");options.addOption("f", "file", true, "指定文件路径");CommandLineParser parser = new DefaultParser();try {CommandLine cmd = parser.parse(options, args); if (cmd.hasOption("h")) {// 显示帮助信息}if (cmd.hasOption("v")) {// 显示版本信息}if (cmd.hasOption("f")) {String filePath = cmd.getOptionValue("f"); // 处理文件路径}} catch (ParseException e) {// 命令行参数解析失败}}}通过上述代码,我们可以实现命令行参数的解析和处理。
详解Java如何获取⽂件编码格式1:简单判断是UTF-8或不是UTF-8,因为⼀般除了UTF-8之外就是GBK,所以就设置默认为GBK。
按照给定的字符集存储⽂件时,在⽂件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理就是只要读出⽂件前三个字节,判定这些字节的值,就可以得知其编码的格式。
其实,如果项⽬运⾏的平台就是中⽂操作系统,如果这些⽂本⽂件在项⽬内产⽣,即开发⼈员可以控制⽂本的编码格式,只要判定两种常见的编码就可以了:GBK和UTF-8。
由于中⽂Windows默认的编码是GBK,所以⼀般只要判定UTF-8编码格式。
对于UTF-8编码格式的⽂本⽂件,其前3个字节的值就是-17、-69、-65,所以,判定是否是UTF-8编码格式的代码⽚段如下:File file = new File(path);InputStream in= new java.io.FileInputStream(file);byte[] b = new byte[3];in.read(b);in.close();if (b[0] == -17 && b[1] == -69 && b[2] == -65)System.out.println(file.getName() + ":编码为UTF-8");elseSystem.out.println(file.getName() + ":可能是GBK,也可能是其他编码");读外部⽂件(先利⽤cpdetector检测⽂件的编码格式,然后⽤检测到的编码⽅式去读⽂件):/*** 利⽤第三⽅开源包cpdetector获取⽂件编码格式** @param path* 要判断⽂件编码格式的源⽂件的路径* @author huanglei* @version 2012-7-12 14:05*/public static String getFileEncode(String path) {/** detector是探测器,它把探测任务交给具体的探测实现类的实例完成。
Java使⽤FileInputStream流读取⽂件⽰例详解⼀、File流概念JAVA中针对⽂件的读写操作设置了⼀系列的流,其中主要有FileInputStream,FileOutputStream,FileReader,FileWriter四种最为常⽤的流⼆、FileInputStream1)FileInputStream概念FileInputStream流被称为⽂件字节输⼊流,意思指对⽂件数据以字节的形式进⾏读取操作如读取图⽚视频等2)构造⽅法2.1)通过打开与File类对象代表的实际⽂件的链接来创建FileInputStream流对象public FileInputStream(File file) throws FileNotFoundException{}若File类对象的所代表的⽂件不存在;不是⽂件是⽬录;或者其他原因不能打开的话,则会抛出FileNotFoundException/**** 运⾏会产⽣异常并被扑捉--因为不存在xxxxxxxx这样的⽂件*/public static void main(String[] args){File file=new File("xxxxxxxx"); //根据路径创建File类对象--这⾥路径即使错误也不会报错,因为只是产⽣File对象,还并未与计算机⽂件读写有关联try{FileInputStream fileInputStream=new FileInputStream(file);//与根据File类对象的所代表的实际⽂件建⽴链接创建fileInputStream对象}catch (FileNotFoundException e){System.out.println("⽂件不存在或者⽂件不可读或者⽂件是⽬录");}}2.2)通过指定的字符串参数来创建File类对象,⽽后再与File对象所代表的实际路径建⽴链接创建FileInputStream流对象public FileInputStream(String name) throws FileNotFoundException通过查看源码,发现该构造⽅法等于是在第⼀个构造⽅法的基础上进⾏延伸的,因此规则也和第⼀个构造⽅法⼀致public FileInputStream(String name) throws FileNotFoundException {this(name != null ? new File(name) : null);}2.3)该构造⽅法没有理解---查看api是指使⽤的fdObj⽂件描述符来作为参数,⽂件描述符是指与计算机系统中的⽂件的连接,前⾯两个⽅法的源码中最后都是利⽤⽂件描述符来建⽴连接的public FileInputStream(FileDescriptor fdObj)3)FileInputStream常⽤API3.1)从输⼊流中读取⼀个字节返回int型变量,若到达⽂件末尾,则返回-1public int read() throws IOException理解读取的字节为什么返回int型变量1、⽅法解释中的-1相当于是数据字典告诉调⽤者⽂件已到底,可以结束读取了,这⾥的-1是Int型2、那么当⽂件未到底时,我们读取的是字节,若返回byte类型,那么势必造成同⼀⽅法返回类型不同的情况这是不允许的3、我们读取的字节实际是由8位⼆进制组成,⼆进制⽂件不利于直观查看,可以转成常⽤的⼗进制进⾏展⽰,因此需要把读取的字节从⼆进制转成⼗进制整数,故返回int型4、因此结合以上3点,保证返回类型⼀致以及直观查看的情况,因此该⽅法虽然读取的是字节但返回int型read⽅法读取实例--最后输出内容和字符内容⼀致是123package com.test;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;public class FileStream{/*****/public static void main(String[] args){//建⽴⽂件对象File file=new File("C:\\Users\\Administrator\\Desktop\\1.txt");try{//建⽴链接FileInputStream fileInputStream=new FileInputStream(file);int n=0;StringBuffer sBuffer=new StringBuffer();while (n!=-1) //当n不等于-1,则代表未到末尾{n=fileInputStream.read();//读取⽂件的⼀个字节(8个⼆进制位),并将其由⼆进制转成⼗进制的整数返回char by=(char) n; //转成字符sBuffer.append(by);}System.out.println(sBuffer.toString());}catch (FileNotFoundException e){System.out.println("⽂件不存在或者⽂件不可读或者⽂件是⽬录");}catch (IOException e){System.out.println("读取过程存在异常");}}}3.2)从输⼊流中读取b.length个字节到字节数组中,返回读⼊缓冲区的总字节数,若到达⽂件末尾,则返回-1public int read(byte[] b) throws IOException1. 我们先设定⼀个缓冲区即字节数组⽤于存储从流中读取的字节数据,该数组的长度为N2. 那么就是从流中读取N个字节到字节数组中。
java日志解析通用模板如何使用Java解析日志文件1. 概述在现代应用程序中,日志记录是非常重要的。
它可以帮助我们追踪问题、监控性能和分析用户行为。
然而,随着应用程序变得越来越复杂,日志文件数量和大小也越来越庞大。
为了更好地理解和利用这些日志文件,我们需要使用合适的工具和技术来解析它们。
本文将介绍如何使用Java编程语言来解析日志文件,以实现更高效的日志分析和问题排查。
2. 选择合适的日志格式在开始解析日志文件之前,我们需要先了解日志文件的格式。
日志文件的格式有很多种,常见的有文本、XML、JSON等格式。
我们需要根据实际情况选择合适的格式来解析。
例如,如果日志以文本形式存储,并且每行都以特定的分隔符分割不同的字段,那么我们可以使用Java的字符串分割函数来解析日志。
如果日志以XML或JSON格式存储,我们可以使用Java的XML或JSON库来解析日志。
3. 读取日志文件一旦选择了合适的日志格式,我们就需要读取日志文件并将其加载到内存中。
Java提供了多种读取文件的方式,最常用的是使用FileInputStream或BufferedReader类。
例如,我们可以使用以下代码来读取文本格式的日志文件:FileInputStream fis = new FileInputStream("log.txt"); BufferedReader br = new BufferedReader(new InputStreamReader(fis)); String line;while ((line = br.readLine()) != null) {解析日志行}br.close();4. 解析日志行一旦读取了日志文件,我们就需要解析每一行的日志。
根据日志文件的格式,我们可以使用正则表达式、字符串分割或解析库来解析日志行。
例如,如果日志以CSV格式存储,并且每行都以逗号分割不同的字段,我们可以使用Java的split 函数来解析日志行。
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比特无符号数值,记录当前冠字号码的记录数。