在实现这个程序中遇到一些编码问题,从txt文件中得到的数据放入xml文件的过程中报错
后来解决了,是转码问题,在eclipse中的build path中把编码格式转成utf-8输出
思路:
分析info.txt文件中的数据,构建一个构造函数类
Regionn.java 代码
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
@XmlAccessorType(XmlAccessType.FIELD)
public class Regionn {
@XmlAttribute(name = "id")
private String id;
@XmlElement(name = "name")
private String name;
@XmlElement(name = "boss")
private String boss;
@XmlElement(name = "avgIncome")
private String avgIncome;
@XmlElement(name = "superRegion")
private String superRegion;
public Regionn() {
}
public Regionn(String id) {
this();
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getBoss() {
return boss;
}
public void setBoss(String boss) {
this.boss = boss;
}
public String getAvgIncome() {
return avgIncome;
}
public void setAvgIncome(String avgIncome) {
this.avgIncome = avgIncome;
}
public String getSuperRegion() {
return superRegion;
}
public void setSuperRegion(String superRegion) {
this.superRegion = superRegion;
}
@Override
public String toString() {
return "Region [id=" + id + ", name=" + name + ", boss=" + boss + ", avgIncome=" + avgIncome + ", superRegion="
+ superRegion + "]";
}
}
代码截图:
Regionn01.png Regionn02.png
思路:
思路的第一点是把txt中的文件读取出来,并把它存放到一个集合中
具体实现:
RegionInfoParser.java 代码
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class RegionInfoParser {
public static List<Regionn> parseRegions(String filename) {
// List<Region> �Ƿ���ֵ���� ��String filename)�Ǵ���IJ���
BufferedReader br = null;// ��ʼ��Ϊ��
List<Regionn> results = new ArrayList<Regionn>();
// <Regionn>�Ƿ���
// ����һ��ArrayList ����
try {
br = new BufferedReader(new FileReader(filename));// ���ļ�
String line = null;// ��ʼ��line
while ((line = br.readLine()) != null) {
// ����ȡ������Ϣ��Ϊ��ʱ
line = line.trim();// ȥ�����ߵĿո�
if (line.startsWith("#")) {
continue;// �����#��ͷ�ģ��������
}
String[] patterns = line.split(",");
// �Ѷ��������л��Զ��Ž��зָ���ַ�浽������
String id = patterns[0];// ����pattern�����±�Ϊ0���ַ�Ϊid
String name = patterns[1];
String avgIncome = patterns[2];
String superRegion = patterns[3];
String boss = (patterns.length == 5) ? patterns[4] : "";// 判断
// 如果patterns这个数组的长度是5的话,那就把数组中最后一个下标的值定义为空字符串
// 多余的加的一个知识点,条件判断
Regionn region = new Regionn();
// Regionn���Զ���ķ�����
region.setId(id);// �Ѵ�info.txt�ļ���ȡ����һ�����ַָ���ַ����������
// Ȼ�������������±�Ϊ0���ַ���Regionn������е�setId()�ķ�������Ϊ������
region.setName(name);
region.setAvgIncome(avgIncome);
region.setSuperRegion(superRegion);
region.setBoss(boss);
results.add(region);// ������б��ĩβ���ָ�����
// List�ǹ����б?��ĩβ���region������ŵ�����String���͵ģ�
// Ȼ�������ŵ�List��һ�������г����������б�
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {// 最后,如果继续读取的不是空的话
try {
br.close();// 一个循环后执行操作关闭继续读取
} catch (IOException e) {
e.printStackTrace();// 返回异常
}
}
}
return results;
}
}
代码截图:
RegionInfoParser01.png RegionInfoParser02.png
思路:
现在需要一个List的包装类,把得到的集合数据放到List<Regionn> regions这个集合类中去
RegionList.java 代码
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="regions")//这些@是把内容输出到xml文件中的意思
@XmlAccessorType(XmlAccessType.FIELD)
public class RegionList {
@XmlElement(name="regions")
private List<Regionn> regions;//定义一个集合类
public RegionList(){
regions=new ArrayList<Regionn>();
//构造函数中的这个regions 是一个集合 new一个新的集合
}
public void setRegions(List<Regionn> regions){
this.regions=regions;//(List<Regionn> regions)传入一个参数是一个集合
}
public List<Regionn> getRegions(){
return regions;//List<Regionn>是这个方法的返回值类型,getRegions得到这个集合
}
public void addRegion(Regionn region){
this.regions.add(region);//region是传入的参数,把这个类中的内容add添加到这个List列表中,List滚动列表
}
}
代码截图:
RegionList01.png
思路:
现在全部的准备操作已经完成,现在是用JAXB来存入数据到xml文件中去,RegionList文件是为JAXB做准备的,@XmlRootElement(name="regions")//这些@是把内容输出到xml文件中的意思
@XmlAccessorType(XmlAccessType.FIELD)
@XmlElement(name="regions")
private List<Regionn> regions;//定义一个集合类
RegionInfoConverter.java 代码
import java.io.File;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
public class RegionInfoConverter {
public static void main(String[] args) {
List<Regionn> regions=RegionInfoParser.parseRegions("info.txt");
//这是一个List列表,里面有11组数据,一组数据是读出的一行内容分割成的字符串数组
RegionList regionListObj=new RegionList();
//new一个RegionList集合类 ,只是为了传参数
regionListObj.setRegions(regions);//把得到的regions这个集合中的数据传入
try {
JAXBContext ctx=JAXBContext.newInstance(RegionList.class);//套路,从RegionList这个Class文件中得到
//在jaxb中,通常如果声明JAXBContext对象:其实它是一个抽象类
ctx.createMarshaller().marshal(regionListObj,new File("info.xml"));
/* marshal 整理,排列,集结 ,regionList是new 的一个RegionList这个类的一个对象,新建一个xml文件,把regionList这个内容所转化出来的数据放入xml文件中
* Marshaller使客户端应用程序能够将 Java 内容树转换回 XML 数据。
* 它提供了各种重载的marshal方法。默认情况下,在将 XML 数据生成
* 到 java.io.OutputStream 或 java.io.Writer 中时,
* Marshaller 将使用 UTF-8 编码。
*/
} catch (JAXBException e) {
e.printStackTrace();//返回异常
}
}
}
代码截图:
RegionInfoConverter.png
实现的内容:
image.png
以下是对JAXBContext的操作理解
(1)JAXBContext。 JAXBContext类提供到 JAXB API 的客户端入口点。它提供了管理实现 JAXB 绑定框架操作所需的 XML/Java 绑定信息的抽象,这些操作包括:解组(Unmarshaller )、编组(Marshaller)和验证(Validator)。通常使用JAXBContext.newInstance(XXX.class) 来获取JAXBContext实例(Student是我定义的一个Entity)。
JAXBContext ctx = JAXBContext.newInstance(Student.class)
(2)Unmarshaller。 Unmarshaller 是一个Interface,它管理将 XML 数据反序列化为新创建的 Java 内容树的过程,并可在解组时有选择地验证 XML 数据。它针对如File,InputStream,URL,StringBuffer等各种不同的输入种类,提供各种重载的 unmarshal 方法。unmarshal 方法从不返回 null。如果unmarshal无法将 XML 内容的根解组到 JAXB 映射对象,则抛出 JAXBException。
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Student stu = (Student) unmarshaller.unmarshal(file);
(3)Marshaller。Marshaller使客户端应用程序能够将 Java 内容树转换回 XML 数据。它提供了各种重载的marshal方法。默认情况下,在将 XML 数据生成到 java.io.OutputStream 或 java.io.Writer 中时,Marshaller 将使用 UTF-8 编码。
Marshaller marshaller = ctx.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);// 格式化输出
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// 设置输出编码,默认为UTF-8
marshaller.marshal(stu, xmlFile);
作者: 聪聪工作室
业务合作: 18758171751
微信: 18758171751
Email: 1099749430@qq.com聪聪工作室---Java---独家制作
版权所有,盗版必究!
网友评论