[英]Reading multiple objects using a 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方法,該方法將在按下不同按鈕時簡單地調用函數,這樣我就可以知道發生問題的時間,並根據要訪問的數據創建Toast。 同樣在該方法的上方,我還初始化了幾個變量,以為顯示如何使它們變好用。
下面是我的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中調用第二個Toast時,或更具體地說,當我調用recordList.get(1)時。 程序說沒有索引1,因為長度只有1。我在這里很困惑,因為我的do:while循環應該遍歷文件,然后在有要讀取的Users時將每個User添加到recordList中。
所以我的問題是:我第二次調用writeUser來覆蓋文件以始終只有一個用戶,如果是的話,我將如何更改代碼,以便將多個Users保留在一個文件中,然后從一個文件中檢索全部用戶。
如果不可能,朝正確方向的一點將不勝感激。 謝謝
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.