使用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();
    }
}