為什么要使用J2ME來讀取INI(配置)文件呢?在單機版游戲當中,使用INI文件來讀取相關命令實屬多余,但是在編寫網絡游戲時,由客戶端讀取從服務器傳來的INI文件流就顯得相當重要了。因為手機游戲客戶端是寫死的程序,不可能實現像PC網絡游戲那樣進行下載客戶端的升級。
因此,將一些經常需要改動的游戲元素,如:NPC屬性,地圖屬性等保存到服務器端,在改動的時候只需要簡單地改變服務器端保存的INI文件內容即可,而手機客戶端只需要解析由服務器傳過來的INI文件流。
import java.io.*;
import java.util.*;
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);
}
//讀取sIndex下的索引內容
//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中腳本引擎的第一步,后面的我會慢慢寫。
同時,我已經將需要注意的地方寫了注釋,如果您對這方面很感興趣,可以聯系我。
E-mail:weidongxu@vip.sina.com QQ:70705327
blog : http:www.sf.org.cn/blog/xuweidong/index.Html
(出處:http://www.49028c.com)
新聞熱點
疑難解答