Java:从XML文件重复读取的性能

时间:2015-08-13 02:13:37

标签: java xml dom javafx xml-parsing

我正在使用 Java JavaFX 开展项目。我确实使用一种方法来允许用户在语言之间进行更改。但我觉得它可能会以某种方式变慢。

  1. 我使用XML文件存储其中的所有文本。
  2. 我创建了函数“readXML”来从XML中读取一个被调用的文本。
  3. 我多次使用这个函数来完成字符串 场景。
  4. enter image description here

    我认为这是错误的,因为我读到重复连续读取XML文件可能会减慢我的应用程序。在添加其他场景时,XML文件也越来越大。这就是我需要帮助的原因。 我仍然在研究这个项目,我的代码现在工作得非常好,但是在每个场景变化中显示有点慢(根据字符串,在500ms到1500ms之间)。我担心下一步这个时间会变得更大。

    以下是包含ReadXMLFile.class的小组readXML

    package modele;
    
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.DocumentBuilder;
    import org.w3c.dom.Document;
    import org.w3c.dom.NodeList;
    import org.w3c.dom.Node;
    import org.w3c.dom.Element;
    
    import java.io.File;
    
    /**
     * Créer par Malek Boubakri le 27/07/2015 à 20:37.
     */
    
    public class ReadXMLFile {
    
        public static String readXML(String name,int lang) {
            String res = "";
            try {
                File fXmlFile = new File("res/files/strings.xml");
                DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                Document doc = dBuilder.parse(fXmlFile);
                doc.getDocumentElement().normalize();
    
                NodeList nList = doc.getElementsByTagName("lang");
                Node nNode = nList.item(lang);
                if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                    Element eElement = (Element) nNode;
                    res=eElement.getElementsByTagName(name).item(0).getTextContent();
                }
                } catch (Exception e) {
                e.printStackTrace();
                }
            return res;
            }
    }
    

    这就是我使用它的方式:

    ....
            lbl_elev_opt1.setText(ReadXMLFile.readXML("lbl_elev_list",SettingDialer.langID));
            lbl_elev_opt2.setText(ReadXMLFile.readXML("lbl_elev_edit",SettingDialer.langID));
            lbl_elev_opt3.setText(ReadXMLFile.readXML("lbl_elev_add",SettingDialer.langID));
            lbl_elev_opt4.setText(ReadXMLFile.readXML("lbl_elev_del",SettingDialer.langID));        
    
            lbl_ens_opt1.setText(ReadXMLFile.readXML("lbl_ens_list",SettingDialer.langID));
            lbl_ens_opt2.setText(ReadXMLFile.readXML("lbl_ens_edit",SettingDialer.langID));
            lbl_ens_opt3.setText(ReadXMLFile.readXML("lbl_ens_class",SettingDialer.langID));
            lbl_ens_opt4.setText(ReadXMLFile.readXML("lbl_ens_exam",SettingDialer.langID));     
    
            lbl_cal_opt1.setText(ReadXMLFile.readXML("lbl_cal_in",SettingDialer.langID));
            lbl_cal_opt2.setText(ReadXMLFile.readXML("lbl_cal_add",SettingDialer.langID));
            lbl_cal_opt3.setText(ReadXMLFile.readXML("lbl_cal_edit",SettingDialer.langID));
    
            lbl_arch_opt1.setText(ReadXMLFile.readXML("lbl_arch_rech",SettingDialer.langID));
            lbl_arch_opt2.setText(ReadXMLFile.readXML("lbl_arch_add",SettingDialer.langID));
            lbl_arch_opt3.setText(ReadXMLFile.readXML("lbl_arch_edit",SettingDialer.langID));       
    
            lbl_doc_opt1.setText(ReadXMLFile.readXML("lbl_doc_off",SettingDialer.langID));
            lbl_doc_opt2.setText(ReadXMLFile.readXML("lbl_doc_dip",SettingDialer.langID));
            lbl_doc_opt3.setText(ReadXMLFile.readXML("lbl_doc_aut",SettingDialer.langID));
    at lease 100 other uses....
    

    如果有什么是模糊的请评论!等待你的帮助......谢谢......

    (抱歉我的坏,奇怪的英语)

1 个答案:

答案 0 :(得分:1)

这是因为每次需要从中访问节点时,您都​​在阅读和解析整个xml文件。

为了解决这个问题,我在 readXML 方法中移动了块,该方法在 init 方法下读取相同文件所需的参数。因此,您阅读xml文件并初始化Document一次,并使用相同的Document实例重复调用,而无需一遍又一遍地读取相同的文件。您可以使用下面的代码替换代码,而无需在其他类中进行任何更改。

public class ReadXMLFile {

private static boolean _initialized = false;
private static Document _doc;

public static void init() {
    if(_initialized) {
        return;
    }

    try {
        File fXmlFile = new File("res/files/strings.xml");
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        _doc = dBuilder.parse(fXmlFile);
        _doc.getDocumentElement().normalize();

        _initialized = true;
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static String readXML(String name, int lang) {
    if(!_initialized) {
        init();
    }

    String res = "";

    try {
        NodeList nList = _doc.getElementsByTagName("lang");
        Node nNode = nList.item(lang);
        if (nNode.getNodeType() == Node.ELEMENT_NODE) {
            Element eElement = (Element) nNode;
            res=eElement.getElementsByTagName(name).item(0).getTextContent();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    return res;
}
}