Java-Properties用法-入门

对于应用程序的配置,通常的做法是将其保存在独立的配置文件中,程序启动时加载,修改时保存。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)

 

配置修改界面

 

修改配置后,窗体参数发生变化

原文地址:https://www.cnblogs.com/pzy4447/p/4706226.html