当前页面位置: » 丰搜网 » 文档中心 » 详细内容
脚本引擎之--读取ini配置文件
为什么要使用
j2me来读取ini(配置)文件呢?在单机版
游戏当中,使用ini文件来读取相关命令实属多余,但是在编写网络
游戏时,由客户端读取从
服务器传来的ini文件流就显得相当重要了。因为手机
游戏客户端是写死的程序,不可能实现像pc网络
游戏那样进行下载客户端的升级。
因此,将一些经常需要改动的
游戏元素,如:npc属性,地图属性等保存到
服务器端,在改动的时候只需要简单地改变
服务器端保存的ini文件内容即可,而手机客户端只需要解析由
服务器传过来的ini文件流。
public class configfile
{
private string scon;
private string str = null;
//构造函数
public configfile()
{
}
/**
* 功能: 读取文件数据
* @param sfile string ini文件名
* @param sindex string []中的内容
* @param scontent string 内容
索引 * @return string 内容
索引的值(string)
* @throws ioexception
*/
public string readfile(string sfile, string sindex, string scontent) throws
ioexception
{
inputstream input;
vector v1 = new vector(); //sindex的值
vector v2 = new vector(); //scontent的值
int p, q, l = 0, i; //保存各字符的
索引 string argindex1 = ""; //中间值
string num1 = ""; //中间值
input = getclass().getresourceasstream(sfile);
str = this.asciitoutf(input);
//将全部字符串分别保存到两个string对象中
string strone = str;
//功能:将流中"["和"]"中的内容全部取出并存放到vector中
//(char)91和(char)93分别返回"["和"]"
while ((p = str.indexof("[")) != -1 &&
(q = str.indexof("]")) != -1)
{
//num1=str.substring(p+1,q);
v1.addelement(str.substring(p + 1, q));
str = str.substring(q + 1);
}
//i循环实现遍历所有"["和"]"中的内容
for (i = 0; i < v1.size(); i++)
{
//检查所遍历的数据是否等于参数sindex的值
if (v1.elementat(i).equals(sindex) == true)
{
//strone.indexof(sindex)得到全部数据中第一个sindex的
索引值
//+sindex.length()后,得到sindex最后一个字节的
索引值
//+2后,去除字符"]"和回车符,但保留换行符
//利用substring将换行符前的字符全部删除并保存到argindex1中
argindex1 = strone.substring(strone.indexof(sindex) + sindex.length() +
2);
if ((p = argindex1.indexof("[")) != -1)
{
//从新字符串的第一个字节开始,读到"["的前两个字节为止,即回车符
num1 = argindex1.substring(0, p - 1);
//r返回换行符的
索引值,s返回"="号的
索引值,l返回回车符的
索引值
while ((p = num1.indexof((char)10)) != -1 &&
(q = num1.indexof("=")) != -1 &&
(l = num1.indexof((char)13)) != -1)
{
//从换行符后的第一个字节开始读取直到"="前面的字节为止
//num3=num1.substring(r+1,s);
v2.addelement(num1.substring(p + 1, q));
//截取从换行符开始到后面的所有字符的新字符串
num1 = num1.substring(l + 1);
}
//读取scontent下的内容
//v2.size()返回当前[]下的行数
for (i = 0; i < v2.size(); i++)
{
//检查所遍历的数据是否等于参数scontent的值
if (v2.elementat(i).equals(scontent) == true)
{
//strtwo.indexof(scontent)找出scontent的
索引 //+scontent.length()返回scontent最后一个字符的
索引值
//获得之后所有字符组成新的字符集
num1 = argindex1.substring(argindex1.indexof(scontent) +
scontent.length());
if ((p = num1.indexof("=")) != -1 &&
(q = num1.indexof((char)13)) != -1)
{
//截取"="后面和回车符前的字符串
scon = num1.substring(p + 1, q);
}
}
}
}
break;
}
}
return scon;
}
//注意这个地方很重要,这里是转换中文的处理。如果没有
//这个函数,如果文件中包含中文将不能正确执行
private string asciitoutf(inputstream inputstream)
{
byte[] mydata = null;
string strdata = null;
try
{
bytearrayoutputstream bytearray = new bytearrayoutputstream();
int ch = 0;
while ((ch = inputstream.read()) != -1)
{
bytearray.write(ch);
}
//将bytearray中的字节全部输入到mydata中
//bytearray.size()为字节长度
for (int i = 0; i < bytearray.size(); i++)
{
mydata = bytearray.tobytearray();
}
strdata = new string(mydata, "utf-8");
}
catch (exception e)
{}
return strdata;
}
}
可以读取的文件示例:
npc.ini
---------------------------
[1]
name=许伟东
sex=男
[]
当然,这只是实现在
j2me中脚本引擎的第一步,后面的我会慢慢写。
同时,我已经将需要注意的地方写了注释,如果您对这方面很感兴趣,可以联系我。
blog : http:www.sf.org.cn/blog/xuweidong/index.
html