2013-02-19 41 views
2

問題「如何逐行讀取本地(res/raw)文件?」處理類似的問題,但我無法根據提供的答案構建解決方案。我得到了一個非常有用的信息(具有readLine方法的DataInputStream類),並且我一直在開發人員網站上研究這個信息並試圖使其工作。存儲在文本文件的連續行成一個字符串數組我可以逐行讀取本地文本文件到字符串數組嗎?

我所試圖做的是閱讀的信息,使得第一行是第一個數組元素,第二行是一個數組元素,等等。然後這個字符串數組將被用於填充下一個打開的活動中的文本字段。這全部發生在開關盒內部(取決於情況,即哪個列表項被選擇,不同的文本文件被加載)。 這是我到目前爲止有:

//Retrieve necessary text file for inputstream 
InputStream buildinginfo = getResources().openRawResource(R.raw.testbuilding); 
class DataInputStream extends FilterInputStream{ 
    protected DataInputStream(InputStream buildinginfo) { 
     super(buildinginfo); 
     // TODO Auto-generated constructor stub 
     int i; 
     String[] building_info; 
     //Assign lines of text to array 
     for(i=0; i<5; i++){ 
      building_info[i] = buildinginfo.readLine(); 
     } 
    } 
} 

到目前爲止,編輯器是好的,它除了這些錯誤,我沒有足夠的經驗,使他們的感覺。我明白他們在說什麼,但不知道如何解決這些問題。這些錯誤出現在我想要設置輸入流並賦值的switch case的部分。 最重要的是,在readline的命令進行的線,我得到: 「 - 該方法的readLine是未定義類型DataInputStream類」 「 - 該方法的readLine是未定義的InputStream類型」

該怎麼辦不明白,因爲如果我沒有弄錯,它在這裏說(http://developer.android.com/reference/java/io/DataInputStream.html)DataInputStream類有readLine方法可用(我從上面提到的問題中發現了這個問題)。顯然我沒有正確使用DataInputStream,但我似乎無法弄清楚。我已經瀏覽了這裏的幾個問題,並參考了上面鏈接的頁面幾次。

如果有人能看到我在做什麼錯了,我會感謝您的幫助很大。如果我爲這種類型的任務完全吠叫錯誤的樹,我爲浪費時間而道歉,但是一些指南或轉介給適當的教程資源將非常感謝。我花了最近兩天試圖找出這些錯誤。

+0

看看這裏的頂部2答案更多的幫助:http://stackoverflow.com/questions/4087674/android-read-text-raw-resource-file – dymmeh 2013-02-19 22:09:19

+0

謝謝一堆!我會玩,並讓你知道,如果我得到它的工作。 – 2013-02-19 22:23:12

+0

但是,爲什麼你不能在字符串xml資源文件中添加文本作爲字符串變量?這裏是它的文檔:http://developer.android.com/guide/topics/resources/string-resource.html – Cata 2013-02-19 22:25:43

回答

11

好吧,所以沒有人幫助你在這裏......在這裏。

本質上,你已經在理解如何使用API​​類方面做出了錯誤的轉變。

您的代碼試圖定義 DataInputStream類。您想要使用API​​已經提供的那個。通過重新定義類實際上掩蓋了API類(您絕對不希望這樣做)。

所以,如果你看一下DataInputStream類的文檔,你會看到一個構造函數。這允許您創建一個類的實例。這是你想要的,而不是:)

InputStream buildinginfo = getResources().openRawResource(R.raw.testbuilding); 
DataInputStream myDIS = new DataInputStream(buildinginfo); 

//you've now got an instance of DataInputStream called myDIS 

String firstString = myDIS.readLine(); 

//voila ... your firstString variable should contain some text 

還有與你陣列碼的問題......但我不會以這種方式使用數組。

你應該使用ArrayList,而後在while循環的線,所以你不需要與大小鼓搗。

首先,讓我們擺脫這一行的(我把它註釋掉:

//String firstString = myDIS.readLine(); 

並創建一個ArrayList是一個模板類,所以請注意在尖括號中的String的實例表示什麼樣的我們希望我們的元素數組中。

ArrayList<String> list = new ArrayList<String>(); 

可以使用add方法將元素添加到ArrayList 我們要做整個事情一氣呵成,不用擔心以後我會解釋...

String myLine; //declare a variable 

//now loop through and check if we have input, if so append it to list 

while((myLine=myDIS.readline())!=null) list.add(myLine); 

最後一行是有點嚼勁,但是當你分配MYLINE這個變量返回一個結果,你可以用NULL比較......一旦最後一行被讀取時,readline的函數將返回null。 while循環的條件等於false並退出循環。

有一個簡單的幫助函數,稱爲toArray將您的數組列表變成一個簡單的數組。

String[] myStringArray = list.toArray(new String[list.size()]) 

您現在有所需的輸出。我建議在Android上觀看一些視頻以獲得對該語言的普遍感受,但我希望這有助於您理解錯誤發生的位置。

+0

+1撰寫迷你短文。 – 2013-02-19 23:14:38

+1

老兄......炸彈答案!我知道這裏肯定有一些根本性的錯誤,但即使在我嘗試瞭解解決方案時,這種語言偶爾會超出我的頭腦。你太棒了。 – 2013-02-21 02:30:24