Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:使用InputStream逐字符读取文件_Java_Android_Inputstream_Android Context - Fatal编程技术网

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

Java Android:使用InputStream逐字符读取文件,java,android,inputstream,android-context,Java,Android,Inputstream,Android Context,解决:我最初发布的代码很好,我只是尝试从assets中的一个目录中读取一个txt文件,而没有在错误的假设“getAssets()”从assets中的所有子目录获取所有资产的情况下将目录名添加到“path”字符串中 我正在制作一个游戏,使用带有名称和说明的卡片,名称和说明从assets文件夹中的.txt文件中读取。该方法是这样创建的:它读取名称为“$”和“#”,描述为“@”和“#”。我在Eclipse(控制台应用程序)中编写了最初的方法,它的工作非常出色。然后我将其转移到Android Studi

解决:我最初发布的代码很好,我只是尝试从assets中的一个目录中读取一个txt文件,而没有在错误的假设“getAssets()”从assets中的所有子目录获取所有资产的情况下将目录名添加到“path”字符串中

我正在制作一个游戏,使用带有名称和说明的卡片,名称和说明从assets文件夹中的.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中。set方法在Card类中

public void setName(StringBuilder sb) {
    this.name = sb.toString();
}
public void setDesc(StringBuilder sb) {
    this.desc = sb.toString();
}
每次我测试它时(通过调用name和desc的get方法),它都会返回空字符串。我做错了什么

其他信息:所有卡子类都从卡超类继承上下文“con”,该超类将主活动的上下文作为卡构造函数中的参数传递,因此我100%确定上下文和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文件,所以我只是在方法中添加了另一个字符串参数(对于目录)并将它们连接起来(在它们之间添加“/”


好吧,考虑到这是另一个完全不同的问题的解决方案,我仍然很高兴这能起作用,因此任何一个正在逐字阅读文件的人都可以参考我最初发布的代码:)

您是否会将这些字段设置的实例与其他未设置的实例混在一起?这将有助于显示将所有内容联系在一起的代码,或者添加数据和所属实例(它,即“this”)的日志记录,在其中设置和获取值,并查看这是否有助于您自己解决问题。添加代码后,我在撰写原始帖子之前考虑了您所说的内容,这就是我添加“this”的原因确保程序中不会出现任何混乱。我承认,我在这方面还是个业余爱好者,所以我不知道在什么情况下我应该和不应该把“这个”放在哪里,所以我把它放在任何地方都是出于偏执。你真的应该让你的捕获块做一个e1.printStackTrace()-现在它只会默默地吸收错误,这往往会导致无法解释的失败。。。一旦你添加了它,查看日志,你很可能会有一些与读取尝试相关的异常。至于过度使用“this”-通常不会帮助事情或防止混淆,因为“this”完全取决于它发生的位置。我知道catch的事情,这个特殊的try-catch块只是测试方法,而不是最终程序的一部分。不过,我会读一些关于如何正确使用“this”的书,谢谢你让我注意到这一点。除了“this”之外,该方法的所有其他内容(InputStream、while循环等)都是按应该的方式编写的?不,您的catch块是非常错误的-您在开发过程中确实必须使用嘈杂的块。如果你想的话,你可以在发布时让它们静音,但是现在在你的I/O代码上有一个空的catch块就相当于把你的手指插进你的耳朵里,继续说你无法分辨出你的程序出了什么问题。