你看一下這個吧.不需要導入特別的包,直接用API中的DOM方式解析,
並保存的.
-------------------------------------------------------------------------------------------------------
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
public class XmlApp extends JFrame implements ActionListener, ItemListener {
private JTextField textField;
private JComboBox comboBox;
private Map<String, String> content = null;
private Document doc;
private String file = "H:\\content.xml";
public XmlApp() {
getContentPane().setLayout(null);
comboBox = new JComboBox();
comboBox.setBounds(110, 10, 112, 21);
comboBox.addItemListener(this);
getContentPane().add(comboBox);
textField = new JTextField();
textField.setBounds(110, 41, 112, 21);
getContentPane().add(textField);
textField.setColumns(10);
JButton btnSave = new JButton("Save");
btnSave.setBounds(252, 40, 93, 23);
btnSave.addActionListener(this);
getContentPane().add(btnSave);
JLabel lblNode = new JLabel("Node");
lblNode.setBounds(10, 13, 90, 15);
getContentPane().add(lblNode);
JLabel lblValue = new JLabel("value");
lblValue.setBounds(10, 44, 90, 15);
getContentPane().add(lblValue);
init();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setSize(400, 120);
setLocationRelativeTo(null);
setVisible(true);
}
public void init() {
content = new HashMap<String, String>();
DocumentBuilderFactory factory;
try {
factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
doc = builder.parse(file);
loopNodes(doc.getFirstChild(), "", false);
textField.setText(content.get(comboBox.getSelectedItem()));
} catch (Exception e) {
System.out.println("e = " + e.getMessage());
}
}
public void loopNodes(Node node, String name, boolean isSave) {
NodeList list = node.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
Node tmp = list.item(i);
if (tmp instanceof Element) {
if (tmp.hasChildNodes()) {
loopNodes(tmp, tmp.getNodeName(), isSave);
}
}
if (tmp instanceof Text) {
String value = tmp.getNodeValue();
if (value != null && !"".equals(value.trim())) {
if (isSave) {
tmp.setNodeValue(content.get(name));
} else {
comboBox.addItem(name);
content.put(name, value.trim());
}
}
}
}
}
public static void main(String[] args) {
new XmlApp();
}
public void actionPerformed(ActionEvent e) {
String value = textField.getText();
content.put((String) comboBox.getSelectedItem(), value);
loopNodes(doc, "", true);
try {
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File(file));
transformer.transform(source, result);
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
textField.setText(content.get(e.getItem()));
}
}
}
② java--swing:實現xml配置文件的修改,沒學到swing,所以啥都不會,也不知道如何通過按鈕去修改
需要知道你是XML內容是什麼
還是說,做一個界面,能讀值,能改值 就可以,不用客內容?
③ java 修改系統配置文件內容
不要直接訪問配置文件,在啟動初始化時,把配置文件etc/sysctl.conf文件讀取到一個內存中的HashMap裡面去,可以使用單例模式實現,所有的添加、修改、訪問全在內存中的HashMap中進行。
啟動系統時,載入配置文件到對象,去判斷重復等等。
退出系統時,將對象,重新覆蓋一下原有的配置文件
運行時所有的修改,全部針對內存中的對象操作
④ java窗體程序 打包jar後 怎麼動態修改xml配置信息,請問哪位大神會啊
這種做法很不好呀,應該在窗體程序中增加一個配置文件,原包中的xml文件做為原始配置不動,窗體程序運行時可做一個菜單項「配置」,新做的配置修改保存到本地一個xml文件中,以後啟動窗體程序時先檢查有沒有這個本地xml文件,有則從它裡面讀入配置,否則從類路徑的jar中讀取配置
⑤ java熱部署:tomcat運行中,動態修改配置文件(java文件)中的static屬性並生效
<Context path="/tomcatTest" reloadable="true" docBase="E:\workplace\testProject\WebRoot"/>
第一個是容器里的項目path 要加/
第二個參數是你的workplace的路徑,一般是到webroot
寫個context.xml文件,放到項目的META-INF里.context.xml頭部像上面那樣寫就可以
⑥ java 向ini配置文件中寫入值。
Java讀取和修改ini配置文件,參考如下:
/*
* ConfigurationFile.java
*
*/
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 這是個配置文檔操作類,用來讀取和配置ini配置文檔
* @author 由月
* @version 2004-08-18
* @修改 2008-05-22
*/
public final class ConfigurationFile {
/**
* 從ini配置文檔中讀取變數的值
* @param file 配置文檔的路徑
* @param section 要獲取的變數所在段名稱
* @param variable 要獲取的變數名稱
* @param defaultValue 變數名稱不存在時的默認值
* @return 變數的值
* @throws IOException 拋出文檔操作可能出現的io異常
*/
public static String getProfileString(
String file,
String section,
String variable,
String defaultValue)
throws IOException {
String strLine, value = "";
BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
boolean isInSection = false;
try {
while ((strLine = bufferedReader.readLine()) != null) {
strLine = strLine.trim();
//strLine = strLine.split("[;]")[0];
Pattern p;
Matcher m;
p = Pattern.compile("\\["+section+"\\]");
m = p.matcher((strLine));
if (m.matches()) {
p = Pattern.compile("\\["+section+"\\]");
m = p.matcher(strLine);
if (m.matches()) {
isInSection = true;
} else {
isInSection = false;
}
}
if (isInSection == true) {
strLine = strLine.trim();
String[] strArray = strLine.split("=");
if (strArray.length == 1) {
value = strArray[0].trim();
if (value.equalsIgnoreCase(variable)) {
value = "";
return value;
}
} else if (strArray.length == 2) {
value = strArray[0].trim();
if (value.equalsIgnoreCase(variable)) {
value = strArray[1].trim();
return value;
}
} else if (strArray.length > 2) {
value = strArray[0].trim();
if (value.equalsIgnoreCase(variable)) {
value = strLine.substring(strLine.indexOf("=") + 1).trim();
return value;
}
}
}
}
} finally {
bufferedReader.close();
}
return defaultValue;
}