我试图在一条遵循预先设定参考的线上抓取一段数据
这是我到目前为止的代码,只是抓住了文本中的所有内容
public void onClick(View v) {
// TODO Auto-generated method stub
if (v.getId() == R.id.btnRead) {
try {
readfile();
} catch (IOException e) {
Toast.makeText(getApplicationContext(), "Problems: " + e.getMessage(), 1).show();
}
}
private void readfile() throws IOException {
String str="";
StringBuffer buf = new StringBuffer();
InputStream is = this.getResources().openRawResource(R.drawable.test);
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
if (is!=null) {
while ((str = reader.readLine()) != null) {
buf.append(str + "\n" );
}
}
is.close();
Toast.makeText(getBaseContext(), buf.toString(), Toast.LENGTH_LONG).show();
我考虑过添加这样的东西
if (str == "name:"){
reader.readNextLine();
}
else {
(buf.append("Referance not found" + "\n"));
}
这样它就能找到预先设定的单词并抓住紧随其后的行 显然我不能
readNextLine
所以试图找到另一种简单的方法
答案 0 :(得分:1)
您的问题是您比较参考地址而不是价值。
用于比较的运算符==
仅对基本类型有效。 String是一种对象类型。
要比较对象类型,您应始终使用equals
方法或compareTo
如果对象支持它。
if("name".equals(str)) {
reader.readNextLine();
} else {
buf.append("Referance not found\n");
}
提示:
StringBuffer是线程安全的,你不需要它。更好的选择是StringBuilder。
答案 1 :(得分:0)
您是否考虑过正则表达式?
String expression = "name: ";
CharSequence inputStr = input;
Pattern pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(inputStr);
if (matcher.matches()) {
// here's where you'd write code to grab the next x amount of information
} else {
// not found
}
或者,如果您接受固定数量的信息(例如,行是名称:Max Power),那么您可以使用字符串标记器/拆分,检查“name:”是否与其中一个标记匹配,然后抓住接下来会有两个令牌,这将是你的名字。您可能还想使用equalsIgnoreCase而不是==来表示字符串,因为它不会产生您想要的结果!