gpt4 book ai didi

java - 如何从文件中检索特定字符串? (安卓)

转载 作者:行者123 更新时间:2023-12-02 06:48:53 26 4
gpt4 key购买 nike

我正在创建一个 Android 应用程序,它记录五个 EditText 输入并将它们存储在一个文件中。我需要知道的是如何单独检索每个文件并将结果输出到另一个 EditText 字段。

我的示例代码:

package chuck.com;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.app.Activity;
import android.content.Intent;

public class FillFile extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fill_file);





Button submit = (Button) findViewById(R.id.button1);
submit.setOnClickListener(sub);
Button disp = (Button) findViewById(R.id.button2);
disp.setOnClickListener(dis);
}
private OnClickListener sub = new OnClickListener(){
public void onClick(View v){

try {
EditText one = (EditText) findViewById(R.id.editText1);
EditText two = (EditText) findViewById(R.id.editText2);
EditText three = (EditText) findViewById(R.id.editText3);
EditText four = (EditText) findViewById(R.id.editText4);
EditText five = (EditText) findViewById(R.id.editText5);

FileOutputStream fos;
fos = openFileOutput("XML.txt", MODE_APPEND);

String uno = one.getText().toString();
String dos = two.getText().toString();
String tres = three.getText().toString();
String quatro = four.getText().toString();
String cinco = five.getText().toString();

fos.write(uno.getBytes());
fos.write(dos.getBytes());
fos.write(tres.getBytes());
fos.write(quatro.getBytes());
fos.write(cinco.getBytes());

} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
private OnClickListener dis = new OnClickListener(){
public void onClick(View v){
Intent transf = new Intent(v.getContext(), MainActivity.class);
startActivityForResult(transf, 0);
}
};
}

我想要将文件导出到的 xml 布局:

 package chuck.com;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

File fileDir = getFilesDir();
String fileName = ("XML.txt");
File backup = new File(fileDir, fileName);
boolean content = backup.length() == 0;

try {
backup.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

TextView one = (TextView) findViewById(R.id.textView1);
TextView two = (TextView) findViewById(R.id.textView2);
TextView three = (TextView) findViewById(R.id.textView3);
TextView four = (TextView) findViewById(R.id.textView4);
TextView five = (TextView) findViewById(R.id.textView5);

EditText eOne = (EditText) findViewById(R.id.editText1);
EditText eTwo = (EditText) findViewById(R.id.editText2);
EditText eThree = (EditText) findViewById(R.id.editText3);
EditText eFour = (EditText) findViewById(R.id.editText4);

Button input = (Button) findViewById(R.id.input_button);
input.setOnClickListener(insert);
if (content)
{
one.setVisibility(View.GONE);
two.setVisibility(View.GONE);
three.setVisibility(View.GONE);
four.setVisibility(View.GONE);

eOne.setVisibility(View.GONE);
eTwo.setVisibility(View.GONE);
eThree.setVisibility(View.GONE);
eFour.setVisibility(View.GONE);
}
else
{
five.setVisibility(View.GONE);

FileInputStream fis;
fis = openFileInput("XML.txt");

eOne.setText(uno);
eTwo.setText(dos);
eThree.setText(tres);
eFour.setText(quatro, cinco);
}
}
private OnClickListener insert = new OnClickListener(){
public void onClick(View v) {
Intent trans = new Intent(v.getContext(), FillFile.class);
startActivityForResult(trans, 0);
}
};
}

最佳答案

fos.write("uno=".getBytes());
fos.write(uno.getBytes());
fos.write("\n".getBytes());
fos.write("dos=".getBytes());
fos.write(dos.getBytes());
...

这将生成一个包含以下内容的文件

uno=<editText1 text>
dos=<editText2 text>
...

然后当你阅读这个文件时。一次读一行。在“=”(或您决定使用的任何分隔符)上拆分行。如果分隔符左侧的文本等于您要查找的键,那么您就知道分隔符右侧的文本是您需要抓取的文本。

就我个人而言,如果我要以这种方式编写文件,我会使用 PrintWriter 而不是 FileOutputStream 只是因为它会使代码更干净一些。它看起来像

PrintWriter pw = new PrintWriter(fos);
pw.println("uno=" + uno);
pw.println("dos=" + dos);
...

编辑(添加了OP请求的代码)

它的作用是逐行读取。它以“=”分隔每一行。然后它将分割字符串的第 0 个位置(这将是“=”左侧的位置)与您的键进行比较。如果它等于您想要的键,那么分割字符串的第一个位置将是您想要抓取的实际文本。

BufferedReader br = new BufferedReader(new FileReader("file.txt"));

String line;
whlie( (line = br.readLine()) != null ){
String[] separated = line.split("=");
if( "uno".equals(separated[0]) )
// Key is uno seaparated[1] has <editText1 text> (assuming example above)
if( "dos".equals(separated[0]) )
// Key is dos separated[1] has <editText2 text> (assuming example above)
...
}

注意您可能应该添加更多错误检查 - 为了简单起见,我排除了它。

举个例子 - 您可以想象这样的情况:用户在编辑文本中输入一些内容,其中包含“=”(例如用户在 editText1 中输入“1+1=2”)。在这种情况下,separated 将分为 3 个部分。

0 您的 key (示例中为 uno)

1 用户输入的第一部分位于用户输入“=”的左侧(示例中为“1+1”)

2 用户输入的第二部分,位于用户输入“=”的右侧(示例中为“2”)。

对此的一个简单解决方案是简单地循环遍历分隔字符串的其余部分,以确保您获得所有信息

if( "uno".equals(separated[0]) ){
String info = "";
for( int i=1; i<separated.length; i++ ){
info += separated[i];
if( (i+1) < separated.length ){
info += "="; // This replaces the user input '=' that you split out
}
}
// After this loop info has the exact String the user entered even if it contained your delimiter ('=' in this example)
}

另一个注意事项除了使用.split()之外,您还可以使用StringTokenizer,它们几乎做同样的事情,但有些人更喜欢一个超过另一个。使用最有效且对您有意义的方法。如果您对两者都不熟悉,这里有一篇很好的文章,展示了 2 Android Split string 的用法

额外编辑 看来新代码中不鼓励使用StringTokenizer。来自 Javadoc http://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html

StringTokenizer 是一个遗留类,出于兼容性原因而保留,尽管在新代码中不鼓励使用它。建议任何寻求此功能的人使用 split 方法Stringjava.util.regex 包代替”

关于java - 如何从文件中检索特定字符串? (安卓),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18282079/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com