我制作了EditText
和Button
。点击该按钮可将文本从EditText
保存到ArrayList
。然后ArrayList
将持久保存到文件中。进一步点击会将文本从EditText
附加到ArrayList
,然后再附加到文件中。但是,保存文件后,我只能从文件中检索输入的第一个项目。我想以逗号分隔格式检索整个列表。
按钮点击代码:
String filename =“abc.text”;
List arrlist = new ArrayList();
b2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String listtext = a1.getText().toString();
// a1 is edittext
if (listtext.equals("")) {
Toast.makeText(getApplicationContext(), "Enter product", Toast.LENGTH_SHORT).show();
} else {
arrlist.add(listtext);
a1.setText("");
try {
FileOutputStream fos = openFileOutput(filename, Context.MODE_APPEND);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(arrlist);
oos.close();
fos.close();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();
}
}
}
});
从文件中检索ArrayList:
List newarrList = new ArrayList();
FileInputStream fis = openFileInput(filename);
ObjectInputStream restore = new ObjectInputStream(fis);
newarrList= (ArrayList)restore.readObject();
restore.close();
String joined = TextUtils.join(", ", newarrList);
Toast.makeText(getApplicationContext(),joined,Toast.LENGTH_LONG).show();
// only the first item is displayed, not sure why
答案 0 :(得分:0)
您继续使用ArrayList
将ObjectInputStream
个对象添加到文件中。但你只读了一个。我想您希望保留一个ArrayList
来添加数据,然后在发生点击时将该ArrayList
保存到文件中,而不是为每个条目附加多个ArrayList
。
List arrist = new ArrayList();
arrlist.add(listtext);
a1.setText("");
try {
FileOutputStream fos = openFileOutput(filename, Context.MODE_APPEND);
ObjectOutputStream oos = new ObjectOutputStream(fos);
每次发生onclick时,附加一个只有一个条目的ArrayList对象
oos.writeObject(arrlist);
oos.close();
fos.close();
}...
如果你想保留你的原始代码,并且状态仅针对单个Activity而持有,并且Activity更改/应用程序重新启动等之间没有持久性。那么这应该可行。
final String filename = "abc.text";
File file = new File(filename);
// moved out of onClickListener
final List arrlist = new ArrayList();
try {
// load the previous contents if it exists
FileInputStream fis = openFileInput(filename);
ObjectInputStream restore = new ObjectInputStream(fis);
ArrayList newArrList = (ArrayList) restore.readObject();
arrlist.addAll(newArrList);
restore.close();
fis.close();
} catch (FileNotFoundException e) {
// ignore, maybe log
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (OptionalDataException e) {
e.printStackTrace();
} catch (StreamCorruptedException e) {
e.printStackTrace();
} catch (IOException e)
e.printStackTrace()
}
b2.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v
) {
String listtext = a1.getText().toString(); //a1 is edittext
if (listtext.equals("")) {
Toast.makeText(getApplicationContext(), "Enter product", Toast.LENGTH_SHORT).show();
} else {
arrlist.add(listtext);
a1.setText("");
try {
将Context.MODE_APPEND
更改为Context.MODE_PRIVATE
,否则我们会继续使用垃圾充气
FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(arrlist);
oos.close();
fos.close();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show();
}
}
}
}
);
另一种方法是不使用ObjectInputStream
,而只使用直接的FileOutputStream,并在每次点击时附加String
内容。
答案 1 :(得分:0)
您将(写)字符串存储到文件中,用逗号结束字符串,然后在阅读__(读取)后将结果拆分为",&#34 ;返回一个String数组。确保将字符串附加到文件中。 ArrayList
变量作为全局变量。
//global variable
List arrlist = new ArrayList();
......
//write to file
b2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String listtext = a1.getText().toString();
.....
arrlist.add(listtext);
.....
listtext = listtext + ",";
FileOutputStream fOut = openFileOutput("file name here", Context.MODE_APPEND);
fOut.write(listtext .getBytes());
fOut.close();
....
}
//reading from file
String fileContent = readFile();
String[] items = TextUtils.split(fileContent, ",");