• 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)

     

    配置修改界面

     

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

  • 相关阅读:
    周末小练习
    第十二届全国大学生信息安全竞赛总结与反思
    sql注入学习心得与sqlmap使用心得
    2019“嘉韦思”杯RSA256题目wp
    斐波那契数列求解的三种方法
    二叉树的下一个节点
    替换空格
    二维数组中的查找
    不修改数组找出重复数字
    数组中重复数字
  • 原文地址:https://www.cnblogs.com/pzy4447/p/4706226.html
Copyright © 2020-2023  润新知