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

Java: Performance of reading repeatedly from an XML file

我正在使用 JavaJavaFX 进行一个项目。我确实实现了一种允许用户在语言之间切换的方法。但是我觉得它可能会很慢。

  1. 我使用 XML 文件来存储所有文本。
  2. 我创建函数 "readXML" 来从 XML 中读取调用的文本。
  3. 我多次使用这个函数来完成 场景。

我认为这是错误的,因为我读到从 XML 文件中反复连续读取会减慢我的应用程序。 XML 文件也越来越大,同时添加了其他场景。这就是为什么我需要这方面的帮助。 我仍在从事该项目,我的代码现在可以正常工作,但它显示每个场景变化都有点慢(在 500 毫秒到 1500 毫秒之间,具体取决于字符串)。恐怕这一点时间在接下来的步骤中会变得更大。

这里是 class 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....

如果有任何模糊之处,请发表评论!等待您的帮助..谢谢..

(抱歉我的英语不好,奇怪)

那是因为每次需要从中访问节点时,您都​​在读取和解析整个 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;
}
}