iT邦幫忙

0

Java 透過Scanner 保存數據

大家好,第一次發文
由於我做了一個學生相關用scaner輸入數據後,關掉程式再打開之後數據都會不見
想請問大家有什麼方法讓數據不會消失,執行程式後還可以對其之前的數據修改.刪除跟調查.保?存
請問我該用什麼方法來實現它呢?
因為沒有用數據庫
等於是我執行程式後輸入數據想要對數據保存,即使重新打開程式數據還是會在,也可以任意修改刪除保存!
謝謝回答
Java新手,查了很多資料自己也是實作試試看了,實在是沒辦法才上來求救!
不知道能不能寫個代碼讓我看看...

public class Client {
    private String name;
    private String birth;
    private String address;
    private String phonenumber;
    private String email;

    public Client(String name, String birth, String address, String phonenumber,String email) {
        this.name = name;
        this.birth = birth;
        this.address = address;
        this.phonenumber = phonenumber;
        this.email = email;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getBirth() {
        return birth;
    }
    public void setBirth(String birth) {
        this.birth = birth;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public String getPhonenumber() {
        return phonenumber;
    }
    public void setPhonenumber(String phonenumber) {
        this.phonenumber = phonenumber;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
}

import java.util.*;

public class ClientManager {
    public static void main(String[] args) {
        ArrayList<Client> clients = new ArrayList<>();
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("===========顧客情報システム===========");
            System.out.println("1. 情報を入力");
            System.out.println("2. 情報を削除");
            System.out.println("3. 情報を修正");
            System.out.println("4. 情報を調査");
            System.out.println("5. システムが終わる");
            System.out.print("番号を入力してください:");
            String command = sc.nextLine();
            switch (command) {
                case "1":
                    addClient(clients);
                    System.out.println("情報を入力しました!");
                    break;
                case "2":
                    deleteClient(clients);
                    break;
                case "3":
                    updateClient(clients);
                    break;
                case "4":
                    queryClient(clients);
                    break;
                case "5":
                    System.out.println("システム終了!");
                    System.exit(0);
                    break;
                default:
                    System.out.println("入力を間違えました!");
            }
            System.out.println("");
        }
    }
    /**
     * 情報を入力メソッド
     *
     * @param clients
     */
    public static void addClient(ArrayList<Client> clients) {
        System.out.println("=================顧客情報を入力============");
        Scanner sc = new Scanner(System.in);
        String name;
        System.out.println("名前を入力してください:");
        name = sc.nextLine();
        System.out.println("生年月日を入力してください:");
        String birth = sc.nextLine();
        System.out.println("住所を入力してください:");
        String address = sc.nextLine();
        System.out.println("電話番号を入力してください:");
        String phonenumber = sc.nextLine();
        System.out.println("メールを入力してください:");
        String email = sc.nextLine();

        Client client = new Client(name, birth, address, phonenumber, email);
        // 入力した情報を追加する
        clients.add(client);
    }
    /**
     * 情報を削除メソッド
     *
     * @param clients
     */
    public static void deleteClient(ArrayList<Client> clients) {
        System.out.println("=================情報を削除============");
            while (true) {
                System.out.println("削除したい名前:");
                Scanner sc = new Scanner(System.in);
                String name = sc.nextLine();
                // 名前が存在するかどうかを確認する
                Boolean bool = isNameRepeat(name, clients);
                if (bool) {
                    int i = getNamesOf(name, clients);
                    clients.remove(i);
                    System.out.println("情報が削除しました。");
                    break;
                } else {
                    System.out.println("情報が存在しません。");
                    break;
                }
            }
        }
    /**
     * 情報を修正するメソッド
     *
     * @param clients
     */
    public static void updateClient(ArrayList<Client> clients) {
        System.out.println("=================情報を修正============");
        Scanner sc = new Scanner(System.in);
            while (true) {
                System.out.println("修正したい名前:");
                String name = sc.nextLine();
                // 名前を存在するかどうかを確認する
                Boolean bool = isNameRepeat(name, clients);
                if (bool) {
                    int names = getNamesOf(name, clients);
                    // 修正したい情報を入力する
                    System.out.println("生年月日を入力してください:");
                    String birth = sc.nextLine();
                    System.out.println("住所を入力してください:");
                    String address = sc.nextLine();
                    System.out.println("電話番号を入力してください:");
                    String phonenumber = sc.nextLine();
                    System.out.println("メールを入力してください:");
                    String email = sc.nextLine();
                    Client newStu = new Client(name, birth, address, phonenumber, email);
                    clients.set(names, newStu);
                    System.out.println("成功しました");
                    break;
                }else {
                    System.out.println("情報が存在しません。");
                    break;
                }
            }
    }
    /**
     * 情報を調べるメソッド
     *
     * @param clients
     */
    private static void queryClient(ArrayList<Client> clients) {
        System.out.println("顧客情報:");
        if (clients.size() > 0) {
            System.out.println("名前\t\t生年月日\t\t住所\t\t電話番号\t\tメール");
            for (int i = 0; i < clients.size(); i++) {
                Client s = clients.get(i);
                StringBuilder sb = new StringBuilder();
                System.out.println(sb.append(s.getName()).append("\t\t").append(s.getBirth()).append("\t\t\t").append(s.getAddress()).append("\t\t").append(s.getPhonenumber()).append("\t\t\t").append(s.getEmail()));
            }
        } else {
            System.out.println("情報が存在しない、情報を入力してください!");
        }
    }
    /**
     *
     * @param name
     * @param clients
     * @return true 
     */
    public static boolean isNameRepeat(String name, ArrayList<Client> clients) {
        // Array中に同じ名前を確認すること
        for (int i = 0; i < clients.size(); i++) {
            Client s = clients.get(i);
            if (name.equals(s.getName())) {
                return true;
            }
        }
        return false;
    }
    /**
     *
     * @param name
     * @param clients
     * @return
     */
    public static int getNamesOf(String name, ArrayList<Client> clients) {
        for (int i = 0; i < clients.size(); i++) {
            Client s = clients.get(i);
            if (name.equals(s.getName())) {
                return i;
            }
        }
        return -1;
    }
}

以上是我寫到現在的代碼
像這樣從程式中輸入進去的資料想要保存修改刪除調查(程式重啟後資料還在狀態下)
https://ithelp.ithome.com.tw/upload/images/20210521/20137621uAktfa5fAv.jpg

謝謝 因為不能回留言區
不好意思第一次使用 謝謝指導已修正

0
海綿寶寶
iT邦大神 1 級 ‧ 2021-05-21 14:44:14
最佳解答
thecomputerpath $ java ClientManager
===========顧客情報システム===========
1. 情報を入力
2. 情報を削除
3. 情報を修正
4. 情報を調査
5. システムが終わる
番号を入力してください:1
=================顧客情報を入力============
名前を入力してください:
Ethan Hunt
生年月日を入力してください:
1977/03/05
住所を入力してください:
Impossible Mission Foundation
電話番号を入力してください:
023939889
メールを入力してください:
ethan.hunt@imf.com
情報を入力しました!

===========顧客情報システム===========
1. 情報を入力
2. 情報を削除
3. 情報を修正
4. 情報を調査
5. システムが終わる
番号を入力してください:5
システム終了!
thecomputerpath $ java ClientManager
1
===========顧客情報システム===========
1. 情報を入力
2. 情報を削除
3. 情報を修正
4. 情報を調査
5. システムが終わる
番号を入力してください:4
顧客情報:
名前		生年月日		住所		電話番号		メール
Ethan Hunt		1977/03/05			Impossible Mission Foundation		023939889			ethan.hunt@imf.com

===========顧客情報システム===========
1. 情報を入力
2. 情報を削除
3. 情報を修正
4. 情報を調査
5. システムが終わる
番号を入力してください:5
システム終了!

你需要這兩個重點動作
1.結束程式的時侯把資料存到檔案 save ArrayList to file
2.程式開始的時侯從檔案讀出資料 read ArrayList from file
我已標示在以下的程式碼中供參考

其他修改的程式碼均標示 here
請自行參考

import java.io.*;	/*here*/

public class Client implements Serializable {	/*here*/
    private String name;
    private String birth;
    private String address;
    private String phonenumber;
    private String email;

    public Client(String name, String birth, String address, String phonenumber,String email) {
        this.name = name;
        this.birth = birth;
        this.address = address;
        this.phonenumber = phonenumber;
        this.email = email;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getBirth() {
        return birth;
    }
    public void setBirth(String birth) {
        this.birth = birth;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public String getPhonenumber() {
        return phonenumber;
    }
    public void setPhonenumber(String phonenumber) {
        this.phonenumber = phonenumber;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
}
import java.util.*;
import java.io.*;	/*here*/

public class ClientManager {
    public static void main(String[] args) {
	    ArrayList<Client> clients = new ArrayList<>();
    	/* 2.read ArrayList from file */
		try {
            FileInputStream readData = new FileInputStream("clientdata.ser");
            ObjectInputStream readStream = new ObjectInputStream(readData);

            clients = (ArrayList<Client>) readStream.readObject();
            System.out.println(clients.size());
            readStream.close();
		} catch (FileNotFoundException e) {
		  	/* System.out.println("檔案不存在"); */
        } catch (IOException | ClassNotFoundException e) {
	        e.printStackTrace();
        }
    	/* 2.read ArrayList from file */
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("===========顧客情報システム===========");
            System.out.println("1. 情報を入力");
            System.out.println("2. 情報を削除");
            System.out.println("3. 情報を修正");
            System.out.println("4. 情報を調査");
            System.out.println("5. システムが終わる");
            System.out.print("番号を入力してください:");
            String command = sc.nextLine();
            switch (command) {
                case "1":
                    addClient(clients);
                    System.out.println("情報を入力しました!");
                    break;
                case "2":
                    deleteClient(clients);
                    break;
                case "3":
                    updateClient(clients);
                    break;
                case "4":
                    queryClient(clients);
                    break;
                case "5":
                	writeClient(clients);	/* here */
                    System.out.println("システム終了!");
                    System.exit(0);
                    break;
                default:
                    System.out.println("入力を間違えました!");
            }
            System.out.println("");
        }
    }
    /**
     * 情報を入力メソッド
     *
     * @param clients
     */
    public static void addClient(ArrayList<Client> clients) {
        System.out.println("=================顧客情報を入力============");
        Scanner sc = new Scanner(System.in);
        String name;
        System.out.println("名前を入力してください:");
        name = sc.nextLine();
        System.out.println("生年月日を入力してください:");
        String birth = sc.nextLine();
        System.out.println("住所を入力してください:");
        String address = sc.nextLine();
        System.out.println("電話番号を入力してください:");
        String phonenumber = sc.nextLine();
        System.out.println("メールを入力してください:");
        String email = sc.nextLine();

        Client client = new Client(name, birth, address, phonenumber, email);
        // 入力した情報を追加する
        clients.add(client);
    }
    /**
     * 情報を削除メソッド
     *
     * @param clients
     */
    public static void deleteClient(ArrayList<Client> clients) {
        System.out.println("=================情報を削除============");
            while (true) {
                System.out.println("削除したい名前:");
                Scanner sc = new Scanner(System.in);
                String name = sc.nextLine();
                // 名前が存在するかどうかを確認する
                Boolean bool = isNameRepeat(name, clients);
                if (bool) {
                    int i = getNamesOf(name, clients);
                    clients.remove(i);
                    System.out.println("情報が削除しました。");
                    break;
                } else {
                    System.out.println("情報が存在しません。");
                    break;
                }
            }
        }
    /**
     * 情報を修正するメソッド
     *
     * @param clients
     */
    public static void updateClient(ArrayList<Client> clients) {
        System.out.println("=================情報を修正============");
        Scanner sc = new Scanner(System.in);
            while (true) {
                System.out.println("修正したい名前:");
                String name = sc.nextLine();
                // 名前を存在するかどうかを確認する
                Boolean bool = isNameRepeat(name, clients);
                if (bool) {
                    int names = getNamesOf(name, clients);
                    // 修正したい情報を入力する
                    System.out.println("生年月日を入力してください:");
                    String birth = sc.nextLine();
                    System.out.println("住所を入力してください:");
                    String address = sc.nextLine();
                    System.out.println("電話番号を入力してください:");
                    String phonenumber = sc.nextLine();
                    System.out.println("メールを入力してください:");
                    String email = sc.nextLine();
                    Client newStu = new Client(name, birth, address, phonenumber, email);
                    clients.set(names, newStu);
                    System.out.println("成功しました");
                    break;
                }else {
                    System.out.println("情報が存在しません。");
                    break;
                }
            }
    }
    /**
     * 情報を調べるメソッド
     *
     * @param clients
     */
    private static void queryClient(ArrayList<Client> clients) {
        System.out.println("顧客情報:");
        if (clients.size() > 0) {
            System.out.println("名前\t\t生年月日\t\t住所\t\t電話番号\t\tメール");
            for (int i = 0; i < clients.size(); i++) {
                Client s = clients.get(i);
                StringBuilder sb = new StringBuilder();
                System.out.println(sb.append(s.getName()).append("\t\t").append(s.getBirth()).append("\t\t\t").append(s.getAddress()).append("\t\t").append(s.getPhonenumber()).append("\t\t\t").append(s.getEmail()));
            }
        } else {
            System.out.println("情報が存在しない、情報を入力してください!");
        }
    }
    /**
    1.save ArrayList to file
    */
    private static void writeClient(ArrayList<Client> clients) {
		try {
            FileOutputStream writeData = new FileOutputStream("clientdata.ser");
            ObjectOutputStream writeStream = new ObjectOutputStream(writeData);

            writeStream.writeObject(clients);
            writeStream.flush();
            writeStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     *
     * @param name
     * @param clients
     * @return true 
     */
    public static boolean isNameRepeat(String name, ArrayList<Client> clients) {
        // Array中に同じ名前を確認すること
        for (int i = 0; i < clients.size(); i++) {
            Client s = clients.get(i);
            if (name.equals(s.getName())) {
                return true;
            }
        }
        return false;
    }
    /**
     *
     * @param name
     * @param clients
     * @return
     */
    public static int getNamesOf(String name, ArrayList<Client> clients) {
        for (int i = 0; i < clients.size(); i++) {
            Client s = clients.get(i);
            if (name.equals(s.getName())) {
                return i;
            }
        }
        return -1;
    }
}

你需要這兩個重點動作
1.結束程式的時侯把資料存到檔案 save ArrayList to file
2.程式開始的時侯從檔案讀出資料 read ArrayList from file
我已標示在以上的程式碼中供參考

0
japhenchen
iT邦大師 1 級 ‧ 2021-05-21 13:25:14

有沒有資料庫都無所謂,我用JSON檔也一樣能管理資料,只要資料量不是大到DICTIONARY / LIST會推不動,就行

JSON檔要大到什麼地步才會"推不動"?我試過,2GB以內,不超過16層深度,基本上都推的動

什麼語言能用JSON?
C#、PYTHON、JAVASCRIPT、VB.net、GO、PHP、...........(我想不出來哪個語言不行了)

0
akss5768
iT邦新手 5 級 ‧ 2021-05-21 21:27:19

建議試用sqlite,比json更為靈活

我要發表回答

立即登入回答