我正在嘗試將多個對象(我創建的用戶對象)寫入一個文件,然後再從文件中讀取它們。我創建了一個測試應用程序,看看這是否容易完成,並且遇到問題。使用FileInputStream讀取多個對象 - Java
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();
}
});
}
這是我爲我的MainActivity,這將簡單的調用函數時按下不同的按鈕做了簡單的onCreate方法,只是這樣我就可以有當事情進展錯誤的想法,並基於數據創建祝酒詞說我想訪問。在這個方法之上還有一些我已經初始化的變量,我認爲這些變量可能會派上用場。
下面是我的writeUser方法,它接受用戶,並將其作爲對象寫入到我使用FileOutputStream訪問的文件中。我也加了一杯吐司,所以我知道它沒有異常拋出。
public void writeUser(User addingUser){
try {
FileOutputStream fou = openFileOutput(FILENAME, Context.MODE_PRIVATE);
ObjectOutputStream oow = new ObjectOutputStream(fou);
oow.writeObject(addingUser);
oow.flush();
oow.close();
Toast.makeText(getBaseContext(), "Data Saved of username: " + addingUser.getUserName(), Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
這裏是我的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第二吐司,或更具體地,當我打電話recordList.get(1)。該程序說,沒有索引1,因爲長度只有1.我在這裏感到困惑,因爲我的do:while循環應該通過文件,然後將每個用戶添加到recordList,同時有用戶可以讀取。
所以我的問題是:我的writeUser覆蓋文件的第二次調用只有一個用戶在任何時候,如果是這樣我會如何更改我的代碼,以便我可以保留多個用戶在一個文件中,然後檢索它們全部來自一個文件。
如果這是不可能的,一個點在正確的方向將不勝感激。謝謝
感謝您指引我在正確的方向 – cjnash