dom4j 读大xml文件

今天由于项目需要,读取一个几百兆的xml文件,直接内存溢出了,主要原因是我一次性读取xml文件的内容造成的,对于大的xml文件还是要读取部分到内存,然后从内存删除,再读取,这里用了dom4j的saxreader


package test;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.codec.binary.Base64;
import org.dom4j.Element;
import org.dom4j.ElementHandler;
import org.dom4j.ElementPath;
import org.dom4j.io.SAXReader;

public class MySaxHandler implements ElementHandler {
	
	SAXReader reader;
	
	static String jdbcURL = "jdbc:sybase:Tds:172.25.130.1:4100/center?charset=cp936";
	static String jdbcDriver = "com.sybase.jdbc3.jdbc.SybDriver";
	static String userName = "xxx";
	static String password = "xxx";
	
	ThreeYearBlackEnt threeYearBlackEnt = new ThreeYearBlackEnt();
	public static Connection con = null;
	
	public static Connection getConnection() throws Exception {
		Class.forName(jdbcDriver);
		return DriverManager.getConnection(jdbcURL, userName, password);
	}
	public static java.sql.Date stringToDate(String str) {
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            // Fri Feb 24 00:00:00 CST 2012
            date = format.parse(str);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 2012-02-24
        //date = java.sql.Date.valueOf(str);
                                             
        return java.sql.Date.valueOf(str);
    }
	public static void addDataBackEnt(Connection con,ThreeYearBlackEnt threeYearBlackEnt) throws SQLException{
		String sql = "insert into J_QYDXB_QG	(QYMC, ZCH,REGORG, FDDBR,FDDBR_ZJHM,FDDBR_ZJMC,DXRQ,BZSM)	values(?, ?, ?, ?, ?,?,?,?)";
		PreparedStatement pst = con.prepareStatement(sql);
		
		pst.setString(1, threeYearBlackEnt.ENTNAME);
		pst.setString(2, threeYearBlackEnt.REGNO);
		pst.setString(3, threeYearBlackEnt.REGORG);
		pst.setString(4, threeYearBlackEnt.NAME);
		pst.setString(5, threeYearBlackEnt.CERNO);
		pst.setString(6, threeYearBlackEnt.CERTYPE);
		pst.setDate(7,  stringToDate(threeYearBlackEnt.REVDATE));
		pst.setString(8, threeYearBlackEnt.ILLEGACT);
		
		pst.execute();
		pst.close();
	}
	
	public MySaxHandler() {
		// test.xml文件跟类放在同一目录下
		try {
			con = getConnection();
			InputStream is = MySaxHandler.class.getResourceAsStream("threeYearBlackEnt_data.xml"); 
			//InputStream is = new FileInputStream("D:\\programfiles\\workspace\\Counter\\threeYearBlackEnt_data1.xml");
			reader = new SAXReader();
			reader.setDefaultHandler(this);
			reader.read(is);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public void onEnd(ElementPath ep) {
		Element element = ep.getCurrent(); //获得当前节点
		if(element.getName().equals("ENTNAME")) {
			threeYearBlackEnt.ENTNAME = new String(Base64.decodeBase64(element.getText()));
			p("ENTNAME="+ threeYearBlackEnt.ENTNAME );
			
		}else if(element.getName().equals("REGNO")) {
			threeYearBlackEnt.REGNO = new String(Base64.decodeBase64(element.getText()));
			p("REGNO="+ threeYearBlackEnt.REGNO);
			
		}else if(element.getName().equals("REGORG")) {
			threeYearBlackEnt.REGORG = new String(Base64.decodeBase64(element.getText()));
			p("REGORG="+ threeYearBlackEnt.REGORG);
		}else if(element.equals("NAME")) {
			threeYearBlackEnt.NAME = new String(Base64.decodeBase64(element.getText()));
			p("NAME="+ threeYearBlackEnt.NAME);
		}else if(element.getClass().equals("CERNO")) {
			threeYearBlackEnt.CERNO = new String(Base64.decodeBase64(element.getText()));
			p("CERNO="+ threeYearBlackEnt.CERNO);
			
		}else if(element.getName().equals("CERTYPE")){
			threeYearBlackEnt.CERTYPE = new String(Base64.decodeBase64(element.getText()));
			p("CERTYPE="+ threeYearBlackEnt.CERTYPE);
			
		}else if(element.getName().equals("REVDATE")) {
			threeYearBlackEnt.REVDATE = new String(Base64.decodeBase64(element.getText()));
			p("REVDATE="+ threeYearBlackEnt.REVDATE);
			
		}else if(element.getName().equals("ILLEGACT")) {
			threeYearBlackEnt.ILLEGACT =new String(Base64.decodeBase64(element.getText()));
			p("ILLEGACT="+ threeYearBlackEnt.ILLEGACT);
			
			try {
				addDataBackEnt(con, threeYearBlackEnt);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		
		
		element.detach(); //记得从内存中移去
	}

	public void onStart(ElementPath ep) {
	}
	
	public static void main(String[] args){
		new MySaxHandler();
	}
	
	public static void p(Object o) {
		if(o != null) System.out.println(o.toString());
	}

}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值