簡體   English   中英

Android:使用InputStream逐個字符讀取文件

[英]Android: Reading a file using InputStream character by character

解決:我最初發布的代碼很好,我只是嘗試從資產目錄中讀取txt文件,而沒有在錯誤假設“ getAssets()”的情況下在“路徑”字符串中添加目錄名稱,但會從資產中的所有子目錄中獲取所有資產。

我正在制作一個使用帶有名稱和描述的卡的游戲,該名稱和描述是從資產文件夾中的.txt文件讀取的。 進行此方法后,它會讀取名稱“ $”和“#”之間的所有內容,並讀取描述中的“ @”和“#”之間的所有內容。 我用Eclipse(控制台應用程序)編寫了原始方法,它的工作原理很吸引人。 然后,我將其轉移到Android Studio,添加了上下文(由於該方法位於類文件中)和AssetManager等,並遵循了其他類似的stackoverflow問題的說明,但由於某種原因,它無法正常工作。

這是代碼:

public void readFile(String p) throws IOException {

    // Path of the directory
    String path = new String(p);
    // AssetManager opens assets
    AssetManager am = con.getAssets();
    // Open file
    InputStream i_s = am.open(path);

    // StringBuilders store the text read for specific members
    StringBuilder _name = new StringBuilder("");  // Records name of card from file
    StringBuilder _desc = new StringBuilder("");  // Records description of card from file

    // "c" stores each character at a time
    char c;

    // Main loop that reads entire file
    while(i_s.available() > 0) { 
        c = (char) i_s.read();

        if(c=='$') {
            c = (char) i_s.read();  // Sends to next character so it doesn't save '$'
            while(c!='#')            // Loop saves everything between '$' and '#'
            {_name.append(c); c = (char) i_s.read();}
        }
        else if(c=='@') {
            c = (char) i_s.read();  // Sends to next character so it doesn't save '@'
            while(c!='#')            // Loop saves everything between '@' and '#'
            {_desc.append(c); c = (char) i_s.read();}
        }
    }
    i_s.close();

    // Sets read info into Class properties
    this.setName(_name);
    this.setDesc(_desc);

}

該方法位於Card的子類CardAction card中。 設置方法在Card類中。

public void setName(StringBuilder sb) {
    this.name = sb.toString();
}
public void setDesc(StringBuilder sb) {
    this.desc = sb.toString();
}

每次測試時(通過調用name和desc的get方法),它將返回空字符串。 我在這里做錯了什么?

附加信息:所有Card子類都繼承自Card超類的上下文“ con”,后者將主要活動的上下文作為Card構造函數中的參數傳遞給它,因此我100%確信Context和AssetManager可以正常工作。

編輯:從主活動中調用readFile方法的代碼

String str;
Turn t = new Turn(3, 40, t_o_d, names, true, 1, con);

// chooseFile returns String of randomly chosen file
// name from the assets folder (randomly "draw" card), works
str = t.chooseFile(1); 

CardAction ca = new CardAction(con); //Passes context as parameter for constructor
 try {ca.readFile(str);}
 catch(IOException e1) {}

 // cardName and cardDesc are TextViews I set just for testing the readFile method
 cardName.setVisibility(View.VISIBLE);
 cardDesc.setVisibility(View.VISIBLE);
 cardName.setText(ca.getName());
 cardDesc.setText(ca.getDesc());

解決了。 該方法很好,我的問題是我試圖打開位於資產中其自己文件夾中的txt文件,因此我只是向該方法(用於目錄)添加了另一個String參數,並將它們串聯(在它們之間添加“ /”) 。

好吧,考慮到這是一個完全可以解決其他問題的解決方案,我仍然很高興這種方法行之有效,因此任何一個人一個字符地閱讀文件的人都可以參考我最初發布的代碼:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM