我正在使用Java和JavaFX开发一个项目。我确实实现了一种方法来允许用户在语言之间进行更改。但我觉得它可能会很慢。
- 我使用 XML 文件来存储其中的所有文本。
- 我创建了函数“readXML”来从 XML 中读取调用的文本。
- 我多次使用这个函数来完成 场景。
我认为这是错误的,因为我读到重复连续地从 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/