在J2ME中讀取各種格式的文本文件
在J2ME開發過程中,我們經常會把一個文字信息保存在txt格式的文本文件中做為資源.這樣便于修改和管理.那么讀取它們對于一些剛接觸j2me的朋友會有些困難.前幾天研究了下,看了一些兄弟的文章和代碼,總結出3種方法分別讀取Unicode,UTF-8,Unicode big endian格式的文件...本文沒考慮讀取的效率問題.
這三種方法都能讀取中文和英文字符.用來存放的數組長度視文本長度而定....
另外還有一些只能讀取英文字符的方法就不列舉出來了.
一,讀取Unicode格式
private String read_Uni(String resource)
{
byte word_uni[]=new byte[1024];
String strReturn="";
InputStream is;
try
{
is=getClass().getResourceAsStream(resource);
is.read(word_uni);
is.close();
StringBuffer stringbuffer = new StringBuffer("");
for (int j = 0; j < word_uni.length; )
{
int k = word_uni[j++]; //注意在這個地方進行了碼制的轉換
if (k < 0)
k += 256;
int l = word_uni[j++];
if (l < 0)
l += 256;
char c = (char) (k + (l << 8)); //把高位和低位數組裝起來
stringbuffer.append(c);
}
strReturn=stringbuffer.toString();
}
catch(IOException e)
{
e.printStackTrace();
}
finally
{
is=null;
}
return strReturn;
}
二,讀取UTF-8格式
public String read_UTF(String name)
{
String strReturn = "";
InputStream in = null;
byte[] word_utf= new byte[1024];
try
{
in = getClass().getResourceAsStream(name);
in.read(word_utf);
in.close();
strReturn=new String(word_utf,"UTF-8");
}
catch(Exception e)
{
System.out.println("readUTF Error:"+e.toString());
}
finally
{
in = null;
}
return strReturn;
}
三,讀取Unicode big endian格式
讀取Unicode big endian格式時,采用readChar()方法讀取,所以存放時使用char數組存放.
注意:在文本的末尾加上'$'表示文本的結束.
另外代碼第10行dis.skip(2)是略過文件頭2個字符,如果用microsoft notepad保存的一定存在這兩個頭字符.
當然,可以使用UltraEdit可以先刪掉這兩個頭字符,然后使用新建文件,復制粘貼,保存為其它格式.這樣兩個頭字符就沒了..
private String read_Uni_b_e(String resource)
{
char word_uni_b_e[]=new char[1024];
String strReturn="";
DataInputStream dis;
try
{
dis=new DataInputStream(getClass().getResourceAsStream(resource));
int counter=0;
dis.skip(2);
char temp;
while(true)
{
temp=dis.readChar();
if(temp=='$')
break;
word_uni_b_e[counter++]=temp;
}
dis.close();
strReturn=String.valueOf(word_uni_b_e,0,counter);
}
catch(Exception e)
{
System.out.println("read_Uni_b_e error!"+e.getMessage());
}
finally
{
dis=null;
}
return strReturn;
}
以上3種方法測試平臺:
Operation System: Microsoft Windows XP Professional Service Pack 1
Emulator: Sun Wireless ToolKit 2.2 beta DefaultColorPhone
J2ME平臺下文本閱讀器的實現
摘要:本文利用J2ME技術開發了一個文本閱讀器,實現了手機對文本文件的顯示,給出了該程序的實現代碼,并對其關鍵技術進行了詳細闡述。
關鍵字: J2ME 文本閱讀器 Java 手機
0引言
隨著通訊技術的發展及手機的普及 ,人們正在不斷地給手機增加新的功能 ,其中 ,使手機實現一般只有 PC機才具有的功能——下載各種程序并運行 ,是目前手機發展的一個重要方向。為此 ,人們提出了各種各樣的解決方案 ,其中基于 JAVA的 J2 ME方案無疑是最引人注目的。
本文通過J2ME開發一個文本閱讀器,該程序可下載到手機上,隨時隨地的進行閱讀,這樣就可以通過這種方式開發一些學習軟件,使手機用戶可有一個隨身學習的工具書。由于J2ME不可以對手機中的文件進行讀寫,所以在開發本程序時,只能在程序打包時把文本文件作為資源文件加入到J2ME發布程序中。如果想讀寫手機上的文件,則要使用各手機商家提供的特定開發平臺和專用的類來開發,下面就文本閱讀器的關鍵技術進行說明。
1 J2ME文本閱讀器中的文本格式
J2ME中文本文件的格式,為了便于程序的開發和在運行中的讀寫處理,對要處理的文本文件要進行一定格式的整理。本程序中的文本要求用純文本即可,每章為一個獨立的文件,每一章中均可為多段,在文本中加入的空格和各種符號都可在閱讀時如實的顯示出來。文件寫好后將其存入相應項目文件夾下的res文件夾中,如本文中的閱讀器的項目名為test,則可將文本文件存入test\res文件夾下。
本系統要閱讀三章內容,所以制作了三個文本文件,分別命名為test1.txt、test2.txt、test3.txt,將三個文件存入test\res文件夾中,到此文本內容準備完成。
2讀取文本文件的主要技術問題
在J2ME中如何讀取文本文件的內容,在本系統中寫了一個函數用來讀取指定的文本文件,文本文件做為參數傳給該函數,該函數的返回值為字符串類型,將文件的內容做為一個完整的字符串返回。在讀取文件內容時用到的主要技術,使用InputStream類定義一個輸入字節流對象in,使用 ByteArrayOutputStream類定義一個內存數組輸出字節流對象s,通過輸入對象的in.read()方法來讀取一個字節,將讀出的字節通過s.write( )方法加入到s中,再使用s.toString()方法將內存轉為字符串返回。讀取文本文件的函數定義如下:
private String myReadLine (String testFileName) {
//函數頭定義了函數的參數為文件名組成的字符串,返回值為一個字符串。
InputStream in = this.getClass().getResourceAsStream(testFileName);
//由文件名參數來定義一個輸入流對象變量in
ByteArrayOutputStream s;
s = new ByteArrayOutputStream(); //產生內存數組輸出字節流對象變量S
try{
int ch=0;
ch=in.read(); //由輸入流對象變量in的read方法以字節為單位來讀取文件的內容,讀取到文件尾時的值為-1。
while ( ch!= -1 ) {
//如果未讀到文件尾把讀取的內容寫入S變量中,并讀取下一字節內容
s.write( ch );
ch=in.read();
}
in.close(); //關閉輸入流對象。
} catch (IOException ioe){
System.out.println(ioe.toString());
}
String str = s.toString(); //將S變量轉為字符串
try{
s.close(); //關閉輸出流對象
} catch (IOException ioe){
System.out.println(ioe.toString());
}
return str.trim(); //返回文件中的內容字符串
}
3 將文本文件內容顯示出來的技術
通過Form類定義一個表單對象f,通過對象的f.append()的方法將讀取文本文件返回的字符串內容加入到表單對象中,為了該表單內容在閱讀完之后可以返回上一級顯示界面,通過f.addCommand()方法在表單中加入一個按鈕對象,并通過f.setCommandListener(this)方法注冊CommandListener高級事件處理,這樣當選擇按鈕時即可調用CommandListener 高級事件接口類中的commandAction()函數,在該函數中判斷是哪個按鈕被選中,通過該函數中的代碼來決定處理流程。最后通過Display類的Display.setCurrent()方法將含有文件內容的表單顯示在手機屏幕上。處理代碼如下:
Form f=new Form("超級閱讀"); //創建一個Form對象f
strContent=myReadLine ("/test1.txt"); //讀取test1.txt文件中的內容返回字符串
f.append(strContent); //將文本文件的內容加入到f對象中
f.addCommand(exitCom); //將退出按鈕選項加入到f對象中
f.setCommandListener(this); //注冊高級事件處理
display.setCurrent(f); //將f對象顯示到手機屏幕上
4 閱讀器中的菜單設計技術
本閱讀器菜單結構分兩級,一級菜單顯示各章的標題,通過選擇某一標題選項進入該章進行內容閱讀,在章內容界面中設置二級菜單選項,二級菜單中只有一個選項即是返回選項,選中該選項后,則回到上一級,可重新選擇章標題,進入新一章內容進行閱讀。一級菜單通過List類來建立,首先產生一個List類的對象l,通過l.append("第一章",null)方法在l對象中加入一條選項,用同樣的方法可加入多條選項,只要將第一章改為第二章、第三章等,可產生一個有多選項的l對象,通過l.addCommand(exitCommand)方法在l對象中加入一個按鈕,作為退出按鈕選項,通過l.setCommandListener(this)注冊高級事件處理機制,通過該高級事件的注冊在操作過程中選中某一選項時,系統自動調用commandAction()函數,并將選中的選項做為參數傳遞給該函數,在函數中判斷選中的是哪一個選項,進行不同的流程處理。最后通過Display類的Display.setCurrent(l)方法將第一級菜單界面顯示在手機屏幕上。一級菜單界面的定義如下:
List l=new List("超級閱讀--小說",Choice.IMPLICIT); //定義一個List對象l
l.addCommand(exitCommand); //在對象l中加入退出按鈕
l.append("第一章",null); //加入第一章選項標題
l.append("第二章",null); //加入第二章選項標題
l.append("第三章",null); //加入第三章選項標題
l.setCommandListener(this); //注冊高級事件處理機制
display.setCurrent(l); //將界面顯示在手機屏幕上
在閱讀器的菜單設計中,無論是選擇了章標題選項,還是選擇了一級菜單中的退出或者是閱讀章內容界面中的退出選項,都將進入commandAction()函數中,在該函數中進行相應判斷進入不同的處理流程代碼。
主要程序代碼如下:
public void commandAction(Command c,Displayable s)
{
if(c==exitCommand)
{//如果是一級菜單的退出按鈕選項則退出本系統
notifyDestroyed();
}
else if (c==exitCom)
{//若是閱讀章內容中的退出按鈕選項則退出閱讀內容界面返回一級菜單界面
startApp();
resumeRequest();
}
else
{//如果選擇的不是任何一個退出按鈕,則進行選擇章標題的判斷
String strContent;
List tmp=(List)s; //將參數s進行類型轉換,轉換為List類對象
switch(tmp.getSelectedIndex())
//判斷選中的是哪一章標題則進行該章內容閱讀界面
{ case 0:
//第一章選中打開test1.txt
Form f=new Form("超級閱讀");
strContent=myReadLine ("/test1.txt");
f.append(strContent);
f.addCommand(exitCom);
f.setCommandListener(this);
display.setCurrent(f);
break;
case 1:
//第二章選中打開test2.txt方法同第一章(略)
case 2:
//第三章選中打開test3.txt,如果還有更多章可按此方法再增加
} // switch 多分支結構語句結束
} //if 選擇結構結束
} // commandAction函數結束












































































































