2013-02-19 89 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