0

我试图在遵循预设参考的线上抓取一条数据

这是我到目前为止的代码,它只是抓住了文本中的所有内容

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

所以试图找到另一种简单的方法

4

2 回答 2

1

您的问题是您比较参考地址而不是值。

比较运算符==仅对原始类型有效。字符串是一种对象类型。

要比较对象类型,您应该始终使用equals方法或者compareTo对象是否支持它。

if("name".equals(str)) {
  reader.readNextLine();
} else {
  buf.append("Referance not found\n");
}

提示:

StringBuffer是线程安全的,你不需要它。更好的选择是使用StringBuilder

于 2012-12-13T12:22:58.370 回答
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),那么您可以使用字符串标记器/拆分器,检查“名称:”是否与其中一个标记匹配,然后获取接下来的两个标记这将是你的名字。您可能还想对字符串使用 equalsIgnoreCase 而不是 == 之类的东西,因为它不会产生您想要的结果!

于 2012-12-13T12:27:47.207 回答