【问题标题】:Can I read a local text file line by line into a string array?我可以将本地文本文件逐行读入字符串数组吗?
【发布时间】:2013-02-19 22:03:14
【问题描述】:

问题“如何逐行读取本地(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();
        }
    }
}

到目前为止,除了这些错误之外,编辑器还可以接受,而且我没有足够的经验来理解它们。我明白他们在说什么,但不知道如何解决。错误位于我试图设置输入流并分配值的开关盒内的部分。 最重要的是,在 readLine 命令发生的那一行,我得到: “- 未定义 DataInputStream 类型的 readLine 方法” "- 未定义 InputStream 类型的 readLine 方法"

我不明白,因为如果我没记错的话,这里 (http://developer.android.com/reference/java/io/DataInputStream.html) 说 DataInputStream 类有可用的 readLine 方法(我从上面提到的问题中发现了这一点)。显然我没有正确使用 DataInputStream,但我似乎无法弄清楚如何。我在这里查看了几个问题,并多次引用了上面链接的页面。

如果有人能看出我做错了什么,我将非常感谢您的帮助。如果我为这种类型的任务完全找错了树,我为浪费时间而道歉,但非常感谢一些指导方针或对适当教程资源的推荐。过去两天我一直在试图找出这些错误。

【问题讨论】:

  • 在此处查看前 2 个答案以获得更多帮助:stackoverflow.com/questions/4087674/…
  • 非常感谢!我会玩它,如果我让它工作,我会告诉你。
  • 但是你为什么不能把文本作为字符串变量添加到字符串 xml 资源文件中呢?这是它的文档:developer.android.com/guide/topics/resources/…
  • 前几行文本很短,但最后一行可能是相当长的字符串。我想这会起作用,我只是认为这可能是一个比简单地在 XML 中定义字符串更优雅的解决方案。可能有多达 100 个定义有关不同建筑物的某些信息的文本文件。根据从建筑物列表中的选择,加载适当的文本文件。我仍然可以看到您的更简单的解决方案会起作用,但另一个问题是并非所有参与项目的人都知道如何在编辑器中工作。
  • 继续...我希望让他们制作所有的文本文件,然后我就不必在编辑器中完成所有这些工作了。感谢您提及它...我并没有真正考虑过它,但如果一切都失败了,我想我可以恢复到那个。

标签: android readline arrays datainputstream


【解决方案1】:

好的,所以没有其他人在这里帮助过你……就这样吧。

基本上你对如何使用 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 上观看一些视频以大致了解该语言,但我希望这有助于您了解错误所在。

【讨论】:

  • 老兄...炸弹回答!我知道这里肯定存在根本性错误,但即使我尝试阅读解决方案,语言有时也会让我头疼。你太棒了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 2011-08-18
相关资源
最近更新 更多