簡體   English   中英

Java - 如何將我的 ArrayList 寫入文件,並將該文件讀取(加載)到原始 ArrayList?

[英]Java - How Can I Write My ArrayList to a file, and Read (load) that file to the original ArrayList?

我正在用 Java 編寫一個程序,該程序顯示一系列課后俱樂部(EG 足球、曲棍球 - 由用戶輸入)。 俱樂部被添加到以下ArrayList

private ArrayList<Club> clubs = new ArrayList<Club>();

通過以下方法:

public void addClub(String clubName) {
    Club club = findClub(clubName);
    if (club == null)
        clubs.add(new Club(clubName));
}

'Club' 是一個帶有構造函數的類 - 名稱:

public class Club {

    private String name;

    public Club(String name) {
        this.name = name;
    }

    //There are more methods in my program but don't affect my query..
}

我的程序正在運行 - 它允許我將一個新的俱樂部對象添加到我的數組列表中,我可以查看數組列表,我可以刪除任何我想要的等等。

但是,我現在想將該數組列表(俱樂部)保存到一個文件中,然后我希望能夠稍后加載該文件,並且再次出現相同的數組列表。

我有兩種方法(見下文),並且一直試圖讓它工作但沒有任何運氣,任何幫助或建議將不勝感激。

保存方法(文件名由用戶選擇)

public void save(String fileName) throws FileNotFoundException {
    String tmp = clubs.toString();
    PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));
    pw.write(tmp);
    pw.close();
}

加載方法(當前代碼不會運行 - 文件是一個字符串但需要是俱樂部?

public void load(String fileName) throws FileNotFoundException {
    FileInputStream fileIn = new FileInputStream(fileName);
    Scanner scan = new Scanner(fileIn);
    String loadedClubs = scan.next();
    clubs.add(loadedClubs);
}

我還使用 GUI 來運行應用程序,目前,我可以單擊“保存”按鈕,然后我可以輸入名稱和位置並保存它。 該文件出現並可以在記事本中打開,但顯示為類似 Club@c5d8jdj(對於我列表中的每個俱樂部)

您應該使用 Java 的內置序列化機制。 要使用它,您需要執行以下操作:

  1. Club類聲明為實現Serializable

     public class Club implements Serializable { ... }

    這告訴 JVM 該類可以序列化為流。 您不必實現任何方法,因為這是一個標記接口。

  2. 要將列表寫入文件,請執行以下操作:

     FileOutputStream fos = new FileOutputStream("t.tmp"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(clubs); oos.close();
  3. 要從文件中讀取列表,請執行以下操作:

     FileInputStream fis = new FileInputStream("t.tmp"); ObjectInputStream ois = new ObjectInputStream(fis); List<Club> clubs = (List<Club>) ois.readObject(); ois.close();

作為練習,我建議執行以下操作:

public void save(String fileName) throws FileNotFoundException {
    PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));
    for (Club club : clubs)
        pw.println(club.getName());
    pw.close();
}

這會將每個俱樂部的名稱寫在您文件的新行上。

 Soccer Chess Football Volleyball ...

我會把負荷留給你。 提示:你一次寫一行,然后你可以一次讀一行。

Java 中的每個類都擴展了Object類。 因此,您可以覆蓋其方法。 在這種情況下,您應該對toString()方法感興趣。 在您的Club類中,您可以覆蓋它以按您喜歡的任何格式打印有關該類的一些消息。

public String toString() {
    return "Club:" + name;
}

然后,您可以將上面的代碼更改為:

public void save(String fileName) throws FileNotFoundException {
    PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));
    for (Club club : clubs)
         pw.println(club); // call toString() on club, like club.toString()
    pw.close();
}

在 Java 8 中,您可以使用帶有兩個參數的Files.write()方法: PathList<String> ,如下所示:

List<String> clubNames = clubs.stream()
    .map(Club::getName)
    .collect(Collectors.toList())

try {
    Files.write(Paths.get(fileName), clubNames);
} catch (IOException e) {
    log.error("Unable to write out names", e);
}

這可能對你有用

public void save(String fileName) throws FileNotFoundException {
FileOutputStream fout= new FileOutputStream (fileName);
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(clubs);
fout.close();
}

要回讀你可以有

public void read(String fileName) throws FileNotFoundException {
FileInputStream fin= new FileInputStream (fileName);
ObjectInputStream ois = new ObjectInputStream(fin);
clubs= (ArrayList<Clubs>)ois.readObject();
fin.close();
}
ObjectOutputStream.writeObject(clubs)
ObjectInputStream.readObject();

此外,您“添加”邏輯在邏輯上等同於使用 Set 而不是 List。 列表可以有重復項,而集合不能。 你應該考慮使用一個集合。 畢竟,你真的可以在同一所學校擁有2個國際象棋俱樂部嗎?

保存和加載一個數組列表的public static ArrayList data = new ArrayList();

我曾經(寫)...

static void saveDatabase() {
try {

        FileOutputStream fos = new FileOutputStream("mydb.fil");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(data);
        oos.close();
        databaseIsSaved = true;         

    }
catch (IOException e) {
        e.printStackTrace();
}

} // End of saveDatabase

並用於(閱讀)...

static void loadDatabase() {

try {           
        FileInputStream fis = new FileInputStream("mydb.fil");
        ObjectInputStream ois = new ObjectInputStream(fis);         
        data = (ArrayList<User>)ois.readObject();
        ois.close();            
    }       
catch (IOException e) {
        System.out.println("***catch ERROR***");
        e.printStackTrace();

    }       
catch (ClassNotFoundException e) {
        System.out.println("***catch ERROR***");
        e.printStackTrace();
    }   
} // End of loadDatabase 

暫無
暫無

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

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