对于应用程序的配置,通常的做法是将其保存在独立的配置文件中,程序启动时加载,修改时保存。Java中Properties类就提供了这样一种机制,配置项以Key-Value的数据结构存储在文本文件中,扩展名为".properties"。Properties的用法很简单,使用load(FileInputStream in)进行读取;使用getProperty(String key)来读取键值;使用put(String key, String value)添加键值对,使用store(FileOutputStream out)方法进行保存。
有时,配置文件只存储了关键项目,其余参数并没有存储在文件中,调用时需要给一个默认值。对于这种情况,Properties提供了两种解决办法:
(1)getProperty(String key, String defaultValue) 当指定key不存在时,返回默认值。
(2)Properties(Properties defaultProperties) 使用默认Properties进行构造,则defaultProperties提供了所有的默认值。
示例代码如下:
PropertiesDemo.java
package ConfigByPropertiesDemo; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; import java.util.Properties; import javax.swing.*; /* * 功能:演示Properties的用法,实现JFrame窗体参数的设置和恢复 * 版本:20150805 * 结构:PropertiesDemo[主窗体],PreferencesDialog,PropertiesHelper */ public class PropertiesDemo extends JFrame { private String configDir;//配置文件目录 private File configPropertiesFile;//配置文件 private Properties configProperties;//配置内容 public PropertiesDemo() { // 加载配置 loadSettings(); // 设置窗体属性 initFrame(); } public void loadSettings() { /* * 如果配置文件不存在,则加载默认配置 */ // 获取当前用户主目录 String userDir = System.getProperty("user.home"); //config路径如果不存在则新建 configDir = userDir + "\config"; File configDirFile = new File(configDir); if (!configDirFile.exists()) { configDirFile.mkdirs(); } // 如果配置文件不存在,则配置内容由默认配置文件导入 configPropertiesFile = new File(configDir + "\config.properties"); if (configPropertiesFile.exists()) { configProperties = PropertiesHelper.loadProperties(configPropertiesFile); } else { try { configPropertiesFile.createNewFile(); configProperties = loadDefaultConfig();//生成默认配置并装载 storeConfigProperties();//保存配置 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public void updateConfigProperties(String key, String value){ /* * 功能:更新configProperties的内容 */ if(configProperties.containsKey(key)){ configProperties.setProperty(key, value); } else { configProperties.put(key, value); } } public String getConfigPropertiesValue(String key){ /* * 功能:根据key获取configProperties中对应的value */ return configProperties.getProperty(key); } public void storeConfigProperties() { //保存配置文件 PropertiesHelper.storeProperties(configProperties, configPropertiesFile, "main properties"); } private Properties loadDefaultConfig() { /* * 加载默认配置 */ Properties defaultConfig = new Properties(); defaultConfig.put("left", "0"); defaultConfig.put("top", "0"); defaultConfig.put("width", "300"); defaultConfig.put("height", "200"); return defaultConfig; } public void restoreDefaultConfig() { /* * 恢复默认配置 */ configProperties = loadDefaultConfig(); } public void initFrame() { int left = Integer.parseInt(configProperties.getProperty("left")); int top = Integer.parseInt(configProperties.getProperty("top")); int width = Integer.parseInt(configProperties.getProperty("width")); int height = Integer.parseInt(configProperties.getProperty("height")); String title = configProperties.getProperty("title", "default title");//如果不存在则取默认值 JMenuBar menubar = new JMenuBar(); JMenu windowMenu = new JMenu("Window"); windowMenu.setMnemonic('W'); JMenuItem preferencesItem = new JMenuItem("Preferences"); preferencesItem.setMnemonic('P'); preferencesItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub PreferencesDialog optionsDialog = new PreferencesDialog(PropertiesDemo.this); optionsDialog.setVisible(true); } }); setJMenuBar(menubar); menubar.add(windowMenu); windowMenu.add(preferencesItem); setBounds(left, top, width, height); setTitle(title); setDefaultCloseOperation(EXIT_ON_CLOSE); } public String getConfigDir() { return configDir; } public static void main(String[] args) { // TODO Auto-generated method stub PropertiesDemo propertiesDemo = new PropertiesDemo(); propertiesDemo.setVisible(true); } }
PreferencesDialog.java
package ConfigByPropertiesDemo; import java.awt.*; import java.awt.event.*; import javax.swing.*; /* * @功能:修改配置对话框 * @版本:20150805 */ class PreferencesDialog extends JDialog{ PropertiesDemo propertiesDemo;//父窗体 private JTextField xField; private JTextField yField; private JTextField widthField; private JTextField heightField; private JTextField titleField; private JButton saveButton ;//保存 private JButton cancelButton ;//取消 private JButton restoreDefaultsButton ;//恢复默认 public PreferencesDialog(PropertiesDemo parent){ super(parent, true); propertiesDemo = parent; //提取主配置信息,作为控件的默认值 String xPosition = propertiesDemo.getConfigPropertiesValue("left"); String yPosition = propertiesDemo.getConfigPropertiesValue("top"); String width = propertiesDemo.getConfigPropertiesValue("width"); String height = propertiesDemo.getConfigPropertiesValue("height"); String title = propertiesDemo.getConfigPropertiesValue("title"); //本UI包含2个panel JPanel inputPanel = new JPanel(); JPanel buttonPanel = new JPanel(); //构造inputPanel inputPanel.setLayout(new GridLayout()); inputPanel.add(new JLabel("xPosition:")); xField = (JTextField) inputPanel.add(new JTextField(xPosition)); inputPanel.add(inputPanel.add(new JLabel("yPosition:"))); yField = (JTextField) inputPanel.add(new JTextField(yPosition)); inputPanel.add(inputPanel.add(new JLabel("witdh:"))); widthField = (JTextField) inputPanel.add(new JTextField(width)); inputPanel.add(inputPanel.add(new JLabel("height:"))); heightField = (JTextField) inputPanel.add(new JTextField(height)); inputPanel.add(inputPanel.add(new JLabel("title:"))); titleField = (JTextField) inputPanel.add(new JTextField(title)); inputPanel.setBorder(BorderFactory.createEmptyBorder(10, 5, 10, 5)); //构造buttonPanel saveButton = new JButton("save"); saveButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { propertiesDemo.updateConfigProperties("left", xField.getText().trim()); propertiesDemo.updateConfigProperties("top", yField.getText().trim()); propertiesDemo.updateConfigProperties("width",widthField.getText().trim()); propertiesDemo.updateConfigProperties("height",heightField.getText().trim()); propertiesDemo.updateConfigProperties("title",titleField.getText().trim()); propertiesDemo.storeConfigProperties();//保存默认配置 JOptionPane.showMessageDialog(null, "保存成功"); setVisible(false); //更新主窗体 propertiesDemo.initFrame(); propertiesDemo.validate(); } }); restoreDefaultsButton = new JButton("restore defaults"); restoreDefaultsButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { propertiesDemo.restoreDefaultConfig(); propertiesDemo.storeConfigProperties(); JOptionPane.showMessageDialog(null, "恢复成功"); setVisible(false); propertiesDemo.initFrame(); propertiesDemo.validate(); } }); cancelButton = new JButton("Cancel"); cancelButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub setVisible(false); } }); buttonPanel.add(restoreDefaultsButton); buttonPanel.add(saveButton); buttonPanel.add(cancelButton); buttonPanel.setBorder(BorderFactory.createEmptyBorder(10, 5, 10, 5)); //构造主框架 getContentPane().setLayout(new BorderLayout()); getContentPane().add(inputPanel, BorderLayout.CENTER); getContentPane().add(buttonPanel, BorderLayout.SOUTH); //设置窗体属性 setTitle("更改主窗体配置"); setLocationRelativeTo(inputPanel); setDefaultCloseOperation(DISPOSE_ON_CLOSE); pack(); } }
PropertiesHelper.java
package ConfigByPropertiesDemo; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Properties; /* * 功能:对Properties进行封装,简化加载或保存Properties的步骤 * 版本:20150805 */ public class PropertiesHelper { /* * @功能根据文件名导入配置 */ public static Properties loadProperties(File file) { Properties properties = new Properties(); try { FileInputStream in = new FileInputStream(file); properties.load(in); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return properties; } /* * @将配置及其备注导出到文件 */ public static void storeProperties(Properties properties, File file, String comments) { try { FileOutputStream out = new FileOutputStream(file); properties.store(out, comments); } catch (Exception e) { e.printStackTrace(); } } }
运行效果如下:
初始界面,位置为(0,0)
配置修改界面
修改配置后,窗体参数发生变化