使用FileInputStream读取多个对象-Java
我试图将多个对象(我创建的用户对象)写入一个文件,然后稍后从文件中读取它们。我创建了一个测试应用程序,看看这是否容易做到,我遇到了问题使用FileInputStream读取多个对象-Java,java,android,Java,Android,我试图将多个对象(我创建的用户对象)写入一个文件,然后稍后从文件中读取它们。我创建了一个测试应用程序,看看这是否容易做到,我遇到了问题 User testUser = new User("cmon", 72, 145, 20, 0); User testUser2 = new User("second", 72, 145, 20, 0); List<User> recordList = new ArrayList<User>(); String FILENAME = "t
User testUser = new User("cmon", 72, 145, 20, 0);
User testUser2 = new User("second", 72, 145, 20, 0);
List<User> recordList = new ArrayList<User>();
String FILENAME = "test_file.slr";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
save = (Button) findViewById(R.id.Save);
save2 = (Button) findViewById(R.id.save2);
load = (Button) findViewById(R.id.load);
textBox = (EditText) findViewById(R.id.edit_message);
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
writeUser(testUser);
}
});
save2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
writeUser(testUser2);
}
});
load.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
readAllUsers();
}
});
}
这是我的readAllUsers()方法,我想获取我添加了两个对象的文件,并检索文件中的用户
public void readAllUsers() {
try {
FileInputStream fis = openFileInput(FILENAME);
ObjectInputStream ois = new ObjectInputStream(fis);
User readCase = null;
do{
readCase = (User)ois.readObject();
if(readCase != null) {
recordList.add(readCase);
}
} while(ois.available() != 0);
Toast.makeText(getBaseContext(), "User 1: " + recordList.get(0).getUserName(), Toast.LENGTH_SHORT).show();
Toast.makeText(getBaseContext(), "User 2: " + recordList.get(1).getUserName(), Toast.LENGTH_SHORT).show();
ois.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
这里的错误是当我在readAllUsers中调用第二个Toast时,或者更具体地说,当我调用recordList.get(1)时。程序说没有索引1,因为长度只有1。我在这里感到困惑,因为我的do:while循环应该遍历文件,然后在有用户要读取时将每个用户添加到记录列表中
所以我的问题是:我第二次调用writeUser覆盖文件时,是否始终只有一个用户?如果是,我将如何更改代码,以便将多个用户保留在一个文件中,然后从一个文件中检索所有用户
如果这是不可能的,在正确的方向上的一点将非常感谢。谢谢
所以我的问题是:我对writeUser的第二次调用是否会覆盖文件,使其始终只有一个用户
是的,这显然是问题所在。每次编写用户
,您的方式都会覆盖上一个文件
[…]如果是这样,我将如何更改代码,以便将多个用户保存在一个文件中,然后从一个文件中检索所有用户
您可能需要在内存中保留一个列表
,并每次保存该列表(覆盖文件),或者,您可以尝试一次将一个用户
附加到您的文件中,请参见(请确保阅读所有详细信息,这有点棘手,例如,您需要先创建文件,然后再附加到文件中,等等)
public void readAllUsers() {
try {
FileInputStream fis = openFileInput(FILENAME);
ObjectInputStream ois = new ObjectInputStream(fis);
User readCase = null;
do{
readCase = (User)ois.readObject();
if(readCase != null) {
recordList.add(readCase);
}
} while(ois.available() != 0);
Toast.makeText(getBaseContext(), "User 1: " + recordList.get(0).getUserName(), Toast.LENGTH_SHORT).show();
Toast.makeText(getBaseContext(), "User 2: " + recordList.get(1).getUserName(), Toast.LENGTH_SHORT).show();
ois.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}