enoeht的Java源码系列(3)--处理配置文件

来源:互联网 发布:哪些智障广告知乎 编辑:程序博客网 时间:2024/06/11 22:01

我们常常会在程序中用到这样的配置文件:

Listener = org.kyle.net.svr.sample.SampleListenerImpl

ServerAddress = 127.0.0.1

ListeningPort = 80

ListenerTimeout = 120

StatelessService = true

LogLevel = ALL

LogPath = server.log

 

在这里提供了一个处理这种配置文件的类的源代码。

package org.kyle.util;

 

import java.io.*;

import java.util.*;

//加载配置文件,并提供从配置文件中读取各种类型的值的方法

public class Profile

{

   protected Properties applicationProps;

   protected String  m_configurationFilename = null;

   private boolean m_debug = false;

 

   public Profile( boolean debug)

   {

       this();

       m_debug = debug;

   }

 

   public Profile()

   {

       this(System.getProperty("MainConfigFile","Server.cfg"));

   }

 

   public Profile(String configurationFilename)

   {

       this.m_configurationFilename = configurationFilename;

       loadCfg(configurationFilename);

   }

 

   public void loadConfig(String configurationFilename)

   {

          if( configurationFilename == null )

          {

               System.exit(-1);

          }

 

          try {

              applicationProps = new Properties();

              FileInputStream in = new FileInputStream(configurationFilename);

              applicationProps.load(in);

              in.close();

          }

          catch( IOException ie)

          {

                    System.exit(-1);

          }

 

  }

 

  public void loadConfig()

  {

      loadConfig( m_configurationFilename );

  }

 

 

   public void saveConfig()

   {

         try

         {

            FileOutputStream out = new FileOutputStream(m_configurationFilename);

            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, "8859_1"));

            synchronized (applicationProps)

            {

              Iterator iterator = new TreeSet(applicationProps.keySet()).iterator();

              while(iterator.hasNext())

              {

                  String key = (String)iterator.next();

                  writer.write(key + "=" + applicationProps.getProperty(key));

                  writer.newLine();

              }

            }

            writer.close();

            out.close();

         }catch(IOException ie)

         {

             System.out.println(ie.toString());

         }

 

   }

 

   public void showConfig()

   {

        applicationProps.list(System.out);

   }

 

   public Properties getProperty()

   {

        return applicationProps;

   }

 

   String getString(String Section, String key, String Default)

   {

         return getString( key, Default);

   }

 

   public String getString(String key, String Default)

   {

          String rVal = applicationProps.getProperty(key, Default);

          return  rVal == null ? rVal : rVal.trim();

   }

 

   public String getString(String key)

   {

          String rVal = applicationProps.getProperty(key);

          return  rVal == null ? rVal : rVal.trim();

   }

 

   public boolean getBoolean(String key, boolean Default)

   {

       String rVal = getString(key);

       //    if (rVal == null) return Default;

       if ("true".equalsIgnoreCase(rVal)) return true;

       if ("false".equalsIgnoreCase(rVal)) return false;

       return Default;

   }

 

   public int getInt(String key, int Default)

   {

       try{

           return getInt(key);

       }catch(Exception e){

           applicationProps.setProperty(key, String.valueOf(Default));

           return Default;

       }

   }

 

   protected int getInt(String key) throws NumberFormatException

   {

          String rVal = getString(key);

          return Integer.parseInt(rVal);

   }

 

   public String getConfigurationFilename()

   {

          return m_configurationFilename;

   }

 

   private void loadCfg(String configurationFilename)

   {

          if( configurationFilename == null )

          {

                 System.out.println("Assigned a null configuration file. Default setting used.");

          }

          try

          {

               applicationProps = new Properties();

               FileInputStream in = new FileInputStream(configurationFilename);

               applicationProps.load(in);

               in.close();

          }

          catch( IOException ioe)

          {

              System.out.println("Loading configuration from file " + configurationFilename + " failed.");

              System.out.println("Default setting will be used.");

          }

    }

}

 

 

 

package org.kyle.util;

 

import java.net.*;

//调用父类加载配置文件和读取数据,按照配置文件的中的key值读取其value

public class GenProfile extends Profile

{

    public GenProfile()

    {

        super();

        buildCachedCrypt();

    }

 

    public GenProfile( String cfgFileName )

    {

        super( cfgFileName );

        buildCachedCrypt();

    }

 

    public String getListenerImpl()

    {

        return getString("Listener", " org.kyle.net.svr.sample.SampleListenerImpl");

    }

 

    public InetAddress getServerAddress()

    {

        try

        {

            String svrAddr = getString("ServerAddress",null);

            if ( svrAddr == null ) return null;

            return InetAddress.getByName( svrAddr );

        }

        catch( UnknownHostException uhe)

        {

            Debug.info(uhe);

        }

        return null;

    }

 

    public int getListenAt()

    {

        return getInt("ListeningPort", 80);

    }

 

    public int getTimeout()

    {

        return getInt("ListenerTimeout", 120);

    }

 

    public boolean  statelessService()

    {

        return getBoolean("StatelessService", true );

    }

 

    public String getLogLevel()

    {

            return getString("LogLevel","CONFIG");

    }

 

    public String getLogPath()

    {

            return getString("LogPath","server.log");

    }

}

 

使用方法:

String cfgFile ="server.cfg";

GenProfile m_env = new GenProfile( cfgFile );

这样在程序中就可以使用例如m_env. getServerAddress()等方法取得配置文件的相应内容了。