J2SE配置文件读取工具

用InstallAnywhere打包Java程序包含MySQL数据库 用InstallAnywhere打包Java程序包含MySQL数据库 InstallAnywhere打包Java程序时可以自动完成jre的打包,但是需要MySQL数据库的程序就得手动添加。资料太少,纠结了三天,终于解决 1、  下载绿色版的MySQL,可以去官网下载。网友制作了MySQL的绿色精简Bat版(http://download.csdn.net/source/5248 阅读详情

为下周的实习做准备,有读取ini配置文件的需求,编写了这个类。

这个版本只实现了读取功能,以后可能继续实现写入功能

 

首先是异常类

package configFile;


/**
 * 配置文件格式错误异常
 * @author Administrator
 *
 */
public class ConfigFileFormatException extends Exception {

	private static final long serialVersionUID = -8622815453009039638L;

}
 
然后是配置文件操作类
package configFile;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.jar.Attributes;

/**
 * 配置文件读取
 * 
 * 实现在J2SE下读取ini配置文件,配置文件的格式如下
 * 
 * #注释
 * [段名]
 * 变量名=变量值
 * 变量名="变量值"
 * 
 * 1、使用#表示注视行
 * 2、段名不指定则为默认段
 * 3、变量名允许使用的字符有[0-9a-zA-Z_-]
 * 4、变量值如果中间有空格,请使用引号,如"Variable value"
 * 
 * @author 石莹
 * @version 1.0
 * 
 */
public class ConfigFile {
	
	//DEBUG
	private final boolean DEBUG = false;

	//保存读入的数据
	private Attributes data = new Attributes();
	
	/**
	 * 获得一个变量的值(默认段)
	 * @param name 要获得的变量名
	 * @return 获得的值
	 */
	public String getAttribute(String name) {
		return data.getValue("Default-" + name);
	}
	
	/**
	 * 获得一个变量的值
	 * @param pageName 要获得的变量的段名(若为null,则表示使用默认段)
	 * @param variableName 要获得的变量名
	 * @return 获得的值
	 */
	public String getAttribute(String pageName, String variableName) {
		if (pageName == null) pageName = "Default";
		return data.getValue(pageName + "-" + variableName);
	}
	
	/**
	 * 读取配置文件
	 * @param filename	要读取的文件名
	 * @throws IOException	如果打开文件发生IO错误,抛出异常
	 * @throws ConfigFileFormatException	如果配置文件格式错误,抛出异常
	 */
	public void readFile(String filename) throws IOException, ConfigFileFormatException {
		
		//获得文件的读入流
		BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filename)));
		
		//段名
		String pageName = "Default";	
		
		//处理需要的StringBuffer
		StringBuffer buffer = new StringBuffer();
		
		//每次循环处理一行
		String lineStr = null;
		while ((lineStr = br.readLine()) != null) {
			//忽略字符串前导空白和尾部空白
			lineStr = lineStr.trim();
			
			//如果是空行,跳过
			if (lineStr.length() == 0)
				continue;
			
			//如果是注视行,跳过
			if (lineStr.charAt(0) == '#')
				continue;
			
			//如果是段标记,更新当前段段名
			if (lineStr.charAt(0) == '[') {
				//清空buffer
				buffer.delete(0, buffer.length());
				//读取段名到buffer中
				int n = 1;
				while (lineStr.charAt(n) != ']') {
					buffer.append(lineStr.charAt(n++));
				}
				if (buffer.length() != 0) {
					pageName = buffer.toString().trim();
				}
				continue;
			}
			
			//读取变量名
			String name = null;
			//清空buffer
			buffer.delete(0, buffer.length());
			//读取变量名到buffer中
			int index = 0;
			while (lineStr.charAt(index) != '=') {
				buffer.append(lineStr.charAt(index++));
			}
			if (buffer.length() != 0) {
				name = buffer.toString().trim();
			} else {
				throw new ConfigFileFormatException();
			}
			
			//读取值
			index ++;	//跳过字符=
			String value = null;
			//清空buffer
			buffer.delete(0, buffer.length());
			//开始读取值
			while (lineStr.charAt(index) == ' ')
				index++;
			if (lineStr.charAt(index) == '"') {
				//如果第一个字符是",那么根据规则使用"作为结束符
				index++;
				//如果字符串结束或找到结束符,循环结束
				while (index < lineStr.length() &&
						lineStr.charAt(index) != '"') {
					buffer.append(lineStr.charAt(index++));
				}
				if (index < lineStr.length()) {
					//如果当前字符串游标合法,说明找到了结束符",查找有效
					value = buffer.toString().trim();
				} else {
					//否则,抛出格式错误异常
					throw new ConfigFileFormatException();
				}
			} else {
				//否则,使用第一个不是[a,z],[A,Z],[0~9]的字符作为结束符
				while (index < lineStr.length() && 
						((lineStr.charAt(index) >= 'a' &&  lineStr.charAt(index) <= 'z') ||
								(lineStr.charAt(index) >= 'A' &&  lineStr.charAt(index) <= 'Z') ||
								(lineStr.charAt(index) >= '0' &&  lineStr.charAt(index) <= '9') ||
								lineStr.charAt(index) == ' ')) {
					buffer.append(lineStr.charAt(index++));
				}
				value = buffer.toString().trim();
			}
			
			//保存读取的值映射
			try {
				data.put(new Attributes.Name(pageName + "-"+ name), value);
			} catch (Exception e) {
				throw new ConfigFileFormatException();
			}
			
			//debug
			if (DEBUG)
				System.out.println(pageName + "-"+ name + " = " + value);////////
		}
	}
}

 

测试

在c盘根目录下存放一个c.ini的配置文件,文件内容如下

test = def

[page]
test = "page test"

 

使用下面的程序测试

import java.io.IOException;

import configFile.ConfigFile;
import configFile.ConfigFileFormatException;



public class test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		ConfigFile cf = new ConfigFile();
		
		try {
			cf.readFile("c://c.ini");
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ConfigFileFormatException e) {
			e.printStackTrace();
		}
		
		System.out.println(cf.getAttribute("test"));
		System.out.println(cf.getAttribute("page", "test"));
	}
}
输出结果

def
page test

手把手教你用ROS2 Humble给PX4无人机写个“画圆”程序:从C++代码到Gazebo仿真全流程 本文详细介绍了如何使用ROS2 Humble和PX4飞控实现无人机圆形轨迹控制,涵盖从环境配置、Gazebo仿真到C++代码实现的完整流程。通过实战教程,读者将掌握轨迹跟踪仿真的核心技术,包括ROS2与PX4的通信接口、圆形轨迹算法设计及Gazebo仿真调试技巧。 阅读详情

相关推荐

手把手教你用GEM-2多频电磁仪找地下管道(附真实数据图)

本文详细解析了使用GEM-2多频电磁仪精准定位地下管线的全流程,包括设备调试、频率选择、现场扫描技巧及数据解读。通过真实案例展示了如何应对复杂干扰环境,提升管线检测效率与准确性,特别适合市政工程和地下管线普查。

weixin_42565652的博客 370

c语言.cfg文件转化为java.cfg_通用C语言函数:操作cfg/ini类型配置文件

#if __OS400__#include "GCFTXTFH"#else#include "GCFTXTF.H"#endifstruct txt_line_flds txt_line_fld[MAX_TXT_LINE_FLD];char CFG_ssl = ’[’, CFG_ssr = ’]’;int CFG_section_line_no, CFG_key_line_no, CFG_key_...

weixin_29032489的博客 431

使用J2SE API读取Properties文件的六种方法

 1。使用java.util.Properties类的load()方法   示例: InputStream in = lnew BufferedInputStream(new FileInputStream(name));   Properties p = new Properties();   p.load(in);   2。使用java.util.ResourceBundle类的getBundle()方法   示例: ResourceBundle rb = ResourceBundle.getBundle(name, Locale.getDefault());   3。使用java.util.PropertyResourceBundle类的构造函数   示例: InputStream in = new BufferedInputStream(new FileInputStream(name));   ResourceBundle rb = new PropertyResourceBundle(in);   4。使用class变量的getResourceAsStream()方法   示例: InputStream in = JProperties.class.getResourceAsStream(name);   Properties p = new Properties();   p.load(in);

使用J2SE API读取Properties文件

使用java.util.Properties类的load()方法 import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Enumeration; import java.util.Properties; /* * 新建一个配置文件(Test.properties),内容可以录入下面的语句。 * name=JJ * Weigh...

wdyliuxingfeiyang的博客 163

J2SE读取配置文件的值properties

util.properties文件 driverClassName = oracle.jdbc.driver.OracleDriver username = "" password = "" url = jdbc:oracle:thin:@192.168.1.20:1521:ora9 poolSize = 10 drivername = com.mysql.jdbc.Driver;...

libinxuan520的专栏 187

Java(J2SE)使用API读取Properties配置文件的六种方法

  Java(J2SE)使用API读取Properties配置文件的六种方法 1。使用java.util.Properties类的load()方法 示例:InputStream in = lnew BufferedInputStream(new FileInputStream(name)); Properties p = new Properties(); p.load(in); 2。...

hacker_zhb的博客 276

J2SE】Java读取配置文件的几种方法

 在现实工作中,我们常常需要保存一些系统配置信息,大家一般都会选择配置文件来完成,本文根据笔者工作中用到的读取配置文件的方法小小总结一下,主要叙述的是spring读取配置文件的方法。 一.读取xml配置文件(一)新建一个java bean package chb.demo.vo;public class HelloBean ...{ private String helloWo

lonelycoder的Java科研站 843

在web和j2se中两个不同环境下 读取配置文件 备忘

如题。 见附件

likenice 152

java 工程 配置文件_java 读取工程下classes配置文件

[使用J2SE API读取Properties文件的六种方法,//如果配置文件在包中,要加入配置文件的路径,一般是在classpath下依次查找,如conf /crm/db.properties,默认路径在classpapublic static String getConfigKey(String key) {String fName = "aa.properties";String keyVa...

weixin_35672450的博客 124

java读取web-inf配置文件_java读取WEB-INF下properties配置文件

[使用J2SE API读取Properties文件的六种方法,//如果配置文件在包中,要加入配置文件的路径,一般是在classpath下依次查找,如conf /crm/db.properties,默认路径在classpaProperties p = new Properties();try{String path = this.class.getClass().getResource("/").g...

weixin_39950867的博客 650

android开发之配置文件

android开发中常到的配置文件处理方式总结: 1.j2se方式:    .properties文件的读取: public static Properties getNetConfigProperties() { Properties props = new Properties(); InputStream in = Utils.class...

魔月 260

java properties 参数_Java Properties 类读取和修改配置文件信息(转)

在我们平时写程序的时候,有些参数是经常改变的,而这种改变不是我们预知的。比如说我们开发了一个操作数据库的模块,在开发的时候我们连接本地的数据库那么IP,数据库名称,表名称,数据库主机等信息是我们本地的,要使得这个操作数据的模块具有通用性,那么以上信息就不能写死在程序里。通常我们的做法是用配置文件来解决。各种语言都有自己所支持的配置文件类型。比如Python,他支持.ini文件。因为他内...

weixin_39864387的博客 329

Java读取Properties文件的六种方法

注:转自http://blog.csdn.net/sajam  学习 Java读取Properties文件的六种方法 使用J2SE API读取Properties文件的六种方法1。使用java.util.Properties类的load()方法示例: InputStream in = lnew BufferedInputStream(new FileInputStream(name))

xyls_2009的专栏 422

通用DAO类

基础:<br />一般编写MVC的数据持久化层是使用DAO模式。所谓DAO,也就是Data Access Object(数据访问接口)。DAO与业务逻辑层传递的是一个实体对象,而这个实体对象是数据库表在程序中的一个映射。<br />所以对于数据库中要操作的每一张表,都要建立一个VO(实体对象)类,一个DAO接口,一个创建DAO的工厂类,以及一个DAO的实现类。而这些基本是一样的,如果程序需要访问多个表的时候,需要大量的重复劳动。就有了抽象出来的必要<br /> 思考:<br />首先分析DAO模式中的每一部

一个程序员的成长历程 1万+

Java用AWT实现的状态栏

      AWT中没有提供状态栏工具,可以在Frame中添加一个Panel实现类似的功能。基本功能有创建状态栏,添加指示器,移除指示器,改变指示器内容,获得指示器内容,添加指示器鼠标消息响应,添加指示器右键弹出菜单,获得对一个指示器的引用等。  import java.awt.Color;import java.awt.Component;import java.awt.Fl

一个程序员的成长历程 1606

Java中用双缓冲技术消除闪烁

在Java编写具有连贯变化的窗口程序时,通常的办法是在子类中覆盖父类的paint(Graphics)方法,在方法中使用GUI函数实现窗口重绘的过程。连贯变换的窗口会不断地调用update(Graphics)函数,该函数自动的调用paint(Graphics)函数。这样就会出现闪烁的情况。为了解决这一问题,可以应用双缓冲技术。可以通过截取上述过程,覆盖update(Graphics)函数,在

一个程序员的成长历程 1506

J2ME游戏设计框架

<br />      因为移动设备运行速度问题,J2ME开发比较注重程序的复杂度。为了寻求时间复杂度与空间复杂度的一个平衡,通常将程序分为多个页面。多个页面就需要一个管理工具。本文展示了一种经典的J2ME中管理多个页面的调度器。<br /> 基础结构<br /> <br />为每一个页面编写一个类,在每一个类中实现以下方法//无参的构造方法//执行的run方法publicvoid run() {} //绘图的paint方法,参数为屏幕的画笔publicvoid paint(Graphics g) {}

一个程序员的成长历程 1209

syDataProcess项目

  项目背景       这是我的毕业设计作品。上次的generalDAO,是为了演示通过反射机制获取字段信息和拼接SQL语句的方式访问数据库。实现的功能较弱,并且项目的可扩展性不强。这次再对数据访问进行分析和抽象,完成了syDataProcess项目。   设计过程       在generalDAO中,获取信息和拼接字符串是在一起完成的使结构混乱。首先应该分开这两种处理过程 1、在底层实现数据库访问,向上提供统一的接口 2、更高层实现通过反射获取VO类信息,并调用统一的数据库访问接口  

一个程序员的成长历程 1068

腾讯x5离线内核:tbs-core-046514-20230612114949-nolog-fs-obfs-armeabi-release.tbs

由于腾讯官方下载有限流问题影响安装成功率,使用离线方案更稳定,目前这个版本是腾讯官方收费改版前,免费使用版本中最新的

上一篇: c语言强化训练——简易计算器
下一篇: J2SE简单的数据库连接池
lingdushanke
博客等级 码龄18年 48粉丝 35原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值