為什么要使用J2ME來(lái)讀取INI(配置)文件呢?在單機(jī)版游戲當(dāng)中,使用INI文件來(lái)讀取相關(guān)命令實(shí)屬多余,但是在編寫網(wǎng)絡(luò)游戲時(shí),由客戶端讀取從服務(wù)器傳來(lái)的INI文件流就顯得相當(dāng)重要了。因?yàn)槭謾C(jī)游戲客戶端是寫死的程序,不可能實(shí)現(xiàn)像PC網(wǎng)絡(luò)游戲那樣進(jìn)行下載客戶端的升級(jí)。
因此,將一些經(jīng)常需要改動(dòng)的游戲元素,如:NPC屬性,地圖屬性等保存到服務(wù)器端,在改動(dòng)的時(shí)候只需要簡(jiǎn)單地改變服務(wù)器端保存的INI文件內(nèi)容即可,而手機(jī)客戶端只需要解析由服務(wù)器傳過(guò)來(lái)的INI文件流。
import java.io.*;
import java.util.*;
public class ConfigFile
{
PRivate String sCon;
private String str = null;
//構(gòu)造函數(shù)
public ConfigFile()
{
}
/**
* 功能: 讀取文件數(shù)據(jù)
* @param sFile String INI文件名
* @param sIndex String []中的內(nèi)容
* @param sContent String 內(nèi)容索引
* @return String 內(nèi)容索引的值(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);
//將全部字符串分別保存到兩個(gè)String對(duì)象中
String strOne = str;
//功能:將流中"["和"]"中的內(nèi)容全部取出并存放到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);
}
//讀取sIndex下的索引內(nèi)容
//i循環(huán)實(shí)現(xiàn)遍歷所有"["和"]"中的內(nèi)容
for (i = 0; i < v1.size(); i++)
{
//檢查所遍歷的數(shù)據(jù)是否等于參數(shù)sIndex的值
if (v1.elementAt(i).equals(sIndex) == true)
{
//strOne.indexOf(sIndex)得到全部數(shù)據(jù)中第一個(gè)sIndex的索引值
//+sIndex.length()后,得到sIndex最后一個(gè)字節(jié)的索引值
//+2后,去除字符"]"和回車符,但保留換行符
//利用substring將換行符前的字符全部刪除并保存到argIndex1中
argIndex1 = strOne.substring(strOne.indexOf(sIndex) + sIndex.length() +
2);
if ((p = argIndex1.indexOf("[")) != -1)
{
//從新字符串的第一個(gè)字節(jié)開始,讀到"["的前兩個(gè)字節(jié)為止,即回車符
num1 = argIndex1.substring(0, p - 1);
//r返回?fù)Q行符的索引值,s返回"="號(hào)的索引值,l返回回車符的索引值
while ((p = num1.indexOf((char)10)) != -1 &&
(q = num1.indexOf("=")) != -1 &&
(l = num1.indexOf((char)13)) != -1)
{
//從換行符后的第一個(gè)字節(jié)開始讀取直到"="前面的字節(jié)為止
//num3=num1.substring(r+1,s);
v2.addElement(num1.substring(p + 1, q));
//截取從換行符開始到后面的所有字符的新字符串
num1 = num1.substring(l + 1);
}
//讀取sContent下的內(nèi)容
//v2.size()返回當(dāng)前[]下的行數(shù)
for (i = 0; i < v2.size(); i++)
{
//檢查所遍歷的數(shù)據(jù)是否等于參數(shù)sContent的值
if (v2.elementAt(i).equals(sContent) == true)
{
//strTwo.indexOf(sContent)找出sContent的索引
//+sContent.length()返回sContent最后一個(gè)字符的索引值
//獲得之后所有字符組成新的字符集
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;
}
//注意這個(gè)地方很重要,這里是轉(zhuǎn)換中文的處理。如果沒(méi)有
//這個(gè)函數(shù),如果文件中包含中文將不能正確執(zhí)行
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中的字節(jié)全部輸入到myData中
//byteArray.size()為字節(jié)長(zhǎng)度
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=男
[]
當(dāng)然,這只是實(shí)現(xiàn)在J2ME中腳本引擎的第一步,后面的我會(huì)慢慢寫。
同時(shí),我已經(jīng)將需要注意的地方寫了注釋,如果您對(duì)這方面很感興趣,可以聯(lián)系我。
E-mail:weidongxu@vip.sina.com QQ:70705327
blog : http:www.sf.org.cn/blog/xuweidong/index.Html
(出處:http://m.survivalescaperooms.com)
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注