Android:逐个字符地使用InputStream读取文件

时间:2015-04-17 17:28:01

标签: java android inputstream android-context

解决了:我最初发布的代码很好,我只是尝试从资产目录中读取一个txt文件而不在“path”字符串中添加目录名称,假设“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);

}

该方法在CardAction卡中,是Card的子类。 set方法在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());

1 个答案:

答案 0 :(得分:0)

解决。方法很好,我的问题是我试图在资源中打开位于自己文件夹中的txt文件,所以我只是在方法中添加了另一个String参数(用于目录)并连接它们(在它们之间添加“/”)

嗯,考虑到这是一个解决完全其他问题的方法,我仍然很高兴这样做,所以任何人都在努力逐字逐句阅读文件可以参考我最初发布的代码:)