2017-06-14 45 views
0

我正在嘗試將多個對象(我創建的用戶對象)寫入一個文件,然後再從文件中讀取它們。我創建了一個測試應用程序,看看這是否容易完成,並且遇到問題。使用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覆蓋文件的第二次調用只有一個用戶在任何時候,如果是這樣我會如何更改我的代碼,以便我可以保留多個用戶在一個文件中,然後檢索它們全部來自一個文件。

如果這是不可能的,一個點在正確的方向將不勝感激。謝謝

回答

1

所以我的問題是:我的第二次writeUser覆蓋文件只有一個用戶在任何時候的調用?

是的,這顯然是問題所在。每次你寫一個User,你這樣做會覆蓋以前的文件。

如果是這樣,我將如何更改我的代碼,以便我可以將多個用戶保存在一個文件中,然後從一個文件中檢索所有用戶?

你要麼需要在內存中保留一個List<User>和每次(覆蓋文件)保存該列表,或者,你可以嘗試追加一個User在同一時間到您的文件,請參閱this answer for details(是一定要閱讀所有的細節,這有點棘手,例如你需要先創建文件然後附加到它等等)

+0

感謝您指引我在正確的方向 – cjnash