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

标签 java xml dom javafx xml-parsing

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

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

enter image description here

我认为这是错误的,因为我读到重复连续地从 XML 文件读取会降低我的应用程序的速度。随着其他场景的添加,XML 文件也变得越来越大。这就是为什么我需要这方面的帮助。 我仍在研究该项目,我的代码现在工作得很好,但它显示每个场景变化都有点慢(在 500 毫秒到 1500 毫秒之间,具体取决于字符串)。我担心这一点时间在接下来的步骤中会变得更大。

这是包含 readXML 的类 ReadXMLFile.class:

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 方法中的 block ,该 block 读取同一文件,无论它在 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;
}
}

关于Java:从 XML 文件重复读取的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31978419/

相关文章:

java - Java 中的加权随机概率

Java/Tomcat : ServletContext & getResourceAsStream Problems

java - 对非导入类进行操作

javascript - 获取 "value"并在另一个函数中使用它

java - 格式错误的 XML/HTML 解析

java - ListView 导致 NullPointerException

c# - 从 Azure 使用 C# 获取 XML 文件作为响应

xml - 将属性添加到由 SQL FOR XML 路径创建的元素节点

c++ - 检查 Rapidxml 中可变数量的兄弟节点和不同的兄弟节点

javascript - knockout.js 并修复了元素上的左滚动绑定(bind)