使用 BufferedReader 从文本文件中的特定行获取数据
Get data from a specific line in text file using BufferedReader
我目前正在构建一个从项目内的文本文件中提取值的应用程序。以某种方式管理从特定行提取数据,但似乎没有得到正确的数据。
代码如下:
private String getInputsFromATextFile(int item) throws FileNotFoundException {
InputStream is = this.getResources().openRawResource(R.drawable.input);
StringBuilder builder = new StringBuilder();
int lineNo = 0;
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
while((line = reader.readLine()) != null){
lineNo++;
if(lineNo == item){
builder.append(reader.readLine());
}
}
reader.close();
}
catch (IOException e){
e.printStackTrace();
}
return builder.toString();
}
下面是文本文件内容:
20.45
21.65
1
225
4102
401
3
3
6
1
196.41
64.11
7
3
5
2
144.01
3
452.33
12
701.33
33
78.12
12
123.90
4
25.00
10
6.51
30.98
2.50
Spiderman
100.00
90
150.00
100
10
34
12
James
1267
Joshue
401
Christelle
3050
Ryan
888
Hanna
5
13
24
9
5
3
50
假设我们在参数中指定了某个行号。此方法 returns 从中分配行号的确切下一个数据。虽然,也许我可以调整它总是 returns (lineNo + 1) 的输出,但是如果我在参数中分配了“0”(零),它会变成 returns null。为什么?我一定是遗漏了一些非常重要的东西。
那是因为您正在再次阅读语句 builder.append(reader.readLine())
中的行。
请注意,您已经在 while
循环中阅读了它。
所以,正确的说法是:
builder.append(line);
追加时不要重复阅读。使用 :
builder.append(line);
此外,如果你想让它被0
索引,你应该在比较之后增加lineno
。
if(lineno == item)
{
}
lineno ++;
如果你在比较之前做它,它永远不会是 0
因此 returns 一个 null
.
这是最优的吗?
如果只是一次性退休 Yes.
如果你一次又一次地使用它 - 不,每次你想要从该行获取数据,你需要遍历整个文件直到该行。
一种方法是将其存储在 ArrayList 中。
InputStream is = this.getResources().openRawResource(R.drawable.input);
ArrayList<String> list = new ArrayList();
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
while((line = reader.readLine()) != null){
list.add(line);
}
reader.close();
}
catch (IOException e){
e.printStackTrace();
}
getLineFromFile(list, 10);
将所有字符串存储在 arrayList 中,然后检索它们。
public String getLineFromFile(ArrayList<String> list, int lineNo);
{
return list.get(lineNo - 1);
}
我目前正在构建一个从项目内的文本文件中提取值的应用程序。以某种方式管理从特定行提取数据,但似乎没有得到正确的数据。
代码如下:
private String getInputsFromATextFile(int item) throws FileNotFoundException {
InputStream is = this.getResources().openRawResource(R.drawable.input);
StringBuilder builder = new StringBuilder();
int lineNo = 0;
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
while((line = reader.readLine()) != null){
lineNo++;
if(lineNo == item){
builder.append(reader.readLine());
}
}
reader.close();
}
catch (IOException e){
e.printStackTrace();
}
return builder.toString();
}
下面是文本文件内容:
20.45
21.65
1
225
4102
401
3
3
6
1
196.41
64.11
7
3
5
2
144.01
3
452.33
12
701.33
33
78.12
12
123.90
4
25.00
10
6.51
30.98
2.50
Spiderman
100.00
90
150.00
100
10
34
12
James
1267
Joshue
401
Christelle
3050
Ryan
888
Hanna
5
13
24
9
5
3
50
假设我们在参数中指定了某个行号。此方法 returns 从中分配行号的确切下一个数据。虽然,也许我可以调整它总是 returns (lineNo + 1) 的输出,但是如果我在参数中分配了“0”(零),它会变成 returns null。为什么?我一定是遗漏了一些非常重要的东西。
那是因为您正在再次阅读语句 builder.append(reader.readLine())
中的行。
请注意,您已经在 while
循环中阅读了它。
所以,正确的说法是:
builder.append(line);
追加时不要重复阅读。使用 :
builder.append(line);
此外,如果你想让它被0
索引,你应该在比较之后增加lineno
。
if(lineno == item)
{
}
lineno ++;
如果你在比较之前做它,它永远不会是 0
因此 returns 一个 null
.
这是最优的吗? 如果只是一次性退休 Yes.
如果你一次又一次地使用它 - 不,每次你想要从该行获取数据,你需要遍历整个文件直到该行。
一种方法是将其存储在 ArrayList 中。
InputStream is = this.getResources().openRawResource(R.drawable.input);
ArrayList<String> list = new ArrayList();
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
while((line = reader.readLine()) != null){
list.add(line);
}
reader.close();
}
catch (IOException e){
e.printStackTrace();
}
getLineFromFile(list, 10);
将所有字符串存储在 arrayList 中,然后检索它们。
public String getLineFromFile(ArrayList<String> list, int lineNo);
{
return list.get(lineNo - 1);
}