簡體   English   中英

使用FileInputStream讀取多個對象-Java

[英]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保留在一個文件中,然后從一個文件中檢索全部用戶。

如果不可能,朝正確方向的一點將不勝感激。 謝謝

因此,我的問題是:我的第二次writeUser覆蓋文件是否始終只有一個用戶嗎?

是的,這顯然是問題所在。 每次您寫入User ,您執行的方式都會覆蓋先前的文件。

[...],如果是的話,我將如何更改代碼,以便將多個用戶保留在一個文件中,然后從一個文件中檢索所有這些用戶?

您可能需要在內存中保留一個List<User>並每次保存該列表(覆蓋文件),或者您可以嘗試一次一個User 附加到文件中, 有關詳細信息 ,請參見此答案 (請確保閱讀所有詳細信息,這有點棘手,例如,您需要先創建文件,然后將其追加,等等)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM