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 AppConfigDemo;

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[主窗体],OptionsDialog,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
                OptionsDialog optionsDialog = new OptionsDialog(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);
    }

}

OptionsDialog.java

package AppConfigDemo;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/*
 * @功能:修改配置对话框
 * @版本:20150805
 */
class OptionsDialog 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 OptionsDialog(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 AppConfigDemo;

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)

配置修改界面

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

时间: 2024-12-15 11:43:05

Java-Properties用法-入门的相关文章

Java关于Properties用法的总结

最近项目中有一个这样的需求,要做一个定时任务功能,定时备份数据库的操表,将表数据写入txt文件.因为文件的读写路径可能需要随时改动,所以写死或者写成静态变量都不方便,就考虑使用配置文件,这里总结些配置文件用法. 一.Java Properties类 1.Java中有个比较重要的的类Properties(java.util.Properties),是代表一个持久的一套详细属性,属性可以被保存到一个流或从流中加载的类.以下是关于属性的要点: 属性列表中每个键及其对应值是一个字符串. 一个属性列表可包

Java properties文件用法

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 package com.suyang.properties; import java.io.FileInputStream; import java.io.FileNotFoundException;

Java学习从入门到精通[转]

Java Learning Path (一).工具篇  一. JDK (Java Development Kit)  JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库(rt.jar).不论什么Java应用服务器实质都是内置了某个版本的JDK.因此掌握JDK是学好Java的第一步.最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA

Java学习从入门到精通(2) [转载]

Java Learning Path(二).书籍篇 学习一门新的知识,不可能指望只看一本,或者两本书就能够完全掌握.需要有一个循序渐进的阅读过程.我推荐Oreilly出版的Java系列书籍. 在这里我只想补充一点看法,很多人学习Java是从<Thinking in Java>这本书入手的,但是我认为这本书是不适合初学者的.我认为正确的使用这本书的方法应该是作为辅助的读物.<Thinking in Java>并不是在完整的介绍Java的整个体系,而是一种跳跃式的写作方法,是一种类似t

Java Web快速入门——全十讲

Java Web快速入门——全十讲 这是一次培训的讲义,就是我在给学生讲的过程中记录下来的,非常完整,原来发表在Blog上,我感觉这里的学生可能更需要. 内容比较长,你可以先收藏起来,慢慢看. 第一讲(参考<Java Web程序设计基础教程>第1章)1 JSP 和 Java的关系 一般Java指的标注版 Java SE   另外两个版本:Java EE 和 Java ME JSP属于Java EE的一部分.   Java EE:     组件:Web层组件(JSP+Servlet)+业务层组件

真正的Java学习从入门到精通

http://www.it.com.cn/f/edu/059/6/169189.htm 一. 工具篇JDK (Java Development Kit) JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库(rt.jar).不论什么Java应用服务器实质都是内置了某个版本的JDK.因此掌握JDK是学好Java的第一步.最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK

Java入门-浅析Java学习从入门到精通【转】

一. JDK (Java Development Kit)  JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库(rt.jar).不论什幺Java应用服务器实质都是内置了某个版本的JDK.因此掌握 JDK是学好Java的第一步.最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发 的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK等等

iOS多线程开发之GCD 用法入门

我们知道,在iOS中进行多线程编程,主要有三种方式:[NSThread].[NSOperation]和[GCD].其中又以[GCD]为苹果官方最为推荐.本文将利用一个简单的demo,简述GCD的用法入门,以及本人对GCD的一点肤浅理解和学习心得. 先把参考文章列出: http://www.cnblogs.com/kenshincui/p/3983982.html http://www.cnblogs.com/sunfrog/p/3305614.html http://mobile.51cto.c

Java RMI 用法总结

RMI就是远程方法调用的简写.顾名思义,就是让一台机器上的对象调用另外一个机器上的对象.RMI的用法非常简单,首先是服务端定义一个接口(接口要扩展Remote接口),再实现这个接口(要扩展UnicastRemoteObject),再绑定到Naming静态类中.客户端通过Naming获取一个远程对象,就可以像普通的对象一样调用远程对象了.RMI中有个Stub类,它的作用就是代理服务器的接口对象,负责将方法的调用转换成网络请求发送给服务器,再从服务器返回对象进行解码.在JDK1.5中,Stub类会自

Eclipse Java properties editor

在写国际化的properties文件时,涉及到中文需要转码. 就想着找一款好一点的插件. 找过很多.最终选择jboss的properties editor. 但是jboss tools 有很多插件.我只是需要properties editor,就想找一个最简单的安装. 于是就尝试新版的选项.找到最贱的安装. 方法如下. 1.到eclipse-market中搜索jboss-tools,选择第二个.点击install(住:未安装会显示install) 2.选择如下红色的勾中,点击confirm 3.