如何在Java中通过序列化创建归档和读取系统?

问题描述 投票:0回答:1

这是书中的一道练习题。题目是设计一个简单的员工信息系统,可以输入数据并显示输入的数据。 此练习的扩展要求我设计一个保存选项,将数组中的对象输出到 tmp 文件中。

我现在已经成功创建了保存的选项。 但我觉得目前的方法有点繁琐,需要多次调用类中的方法。 enter image description here

但是我不能将ObjectOutputStream直接放在类中,会出现IOException。 另外,下一个问题要求我创建一个读取文件的选项。 我不知道如何将数据读取后直接导入到数组中。

package myJava.exercise.ch12;
import java.io.BufferedReader;
import java.lang.*;
import java.util.Scanner;
import java.io.*;

public class ex12_06      
{
    public static void main(String args[])throws IOException
    {
        CPersonAccount obj = new CPersonAccount();
        char runFunc='d';
        Scanner keyboardInput = new Scanner(System.in);
        
        while(runFunc!='q')
        {
          System.out.print("請選擇作業");
          System.out.print("(i=輸入資料 s=依月薪資排序 d=顯示資料 q=離開 S=存檔):");
          runFunc = keyboardInput.nextLine().charAt(0);
          switch (runFunc)
          {
            case 'i':
               obj.inputData();
               break;            
            case 's':
               obj.sortBySalary();
               break;
            case 'd':
               obj.displayData();
               break;
            case 'S':
               FileOutputStream fo = new FileOutputStream("C:\\myJava\\exercise\\ch12\\file\\ex6.tmp");
               ObjectOutputStream os = new ObjectOutputStream(fo);
               for(int i=0;i<obj.dataNum();i++){
                 os.writeObject(obj.saveName(i));
                 os.writeObject(obj.saveDegree(i));
                 os.writeObject(obj.saveId(i));
                 os.writeObject(obj.saveSalary(i));
              }
              os.close();
              fo.close();
           default:
               break;
          }
        }
   } 
}   

`your text`
class CPersonData{
  public String name;
  public String degree;
  private String p_id;
  private int salary;

  public CPersonData(){
    name = "~~~~~~~~";
    degree = "~~~~~~~~";
    salary = 0;
  }

  public CPersonData(String a,String b,String c,int d){
   name = a;
   degree = b;
   p_id = c;
   salary = d;
  }

  public int getSalary(){
   return salary;
  }

  public String getId(){
    return p_id;
   }

  public void show(){
    System.out.print(name+"\t");
    System.out.print(degree+"\t");
    System.out.println(salary);
  }

}

class CPersonAccount{
  CPersonData personArr[] = new CPersonData[1]; 
  BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
  String a,b,c;
  int d;

  public CPersonAccount(){}

  public void inputData(){
    for(int i=0;i<personArr.length;i++){
      while (true) {
        try{
            System.out.println("請輸入員工姓名");
            a = buf.readLine();
            break;
        }
        catch(Exception e){
            System.out.println("錯誤,請重新輸入");
        }
      }
      while (true) {
        try{
            System.out.println("請輸入員工職別");
            b = buf.readLine();
            break;
        }
        catch(Exception e){
            System.out.println("錯誤,請重新輸入");
        }
      }
      while (true) {
        try{
            System.out.println("請輸入員工ID");
            c = buf.readLine();  
            break;
        }
        catch(Exception e){
            System.out.println("錯誤,請重新輸入");
        }
      }
      while (true) {
        try{
            System.out.println("請輸入員工薪資");
            d = Integer.parseInt(buf.readLine()); 
            break;
        }
        catch(Exception e){
            System.out.println("錯誤,請重新輸入");
        }
      }
      personArr[i] = new CPersonData(a,b,c,d);
    }
  }

  public void displayData(){
    CPersonData tit = new CPersonData();
    tit.show();
    for(int i=0;i<personArr.length;i++){
      System.out.print(personArr[i].name+"\t");
      System.out.print(personArr[i].degree+"\t");
      System.out.println(personArr[i].getSalary());
    }
  }

  public void sortBySalary(){

  }

  public String saveName(int x){
    return personArr[x].name;
  }

  public String saveDegree(int x){
    return personArr[x].degree;
  }

  public String saveId(int x){
    return personArr[x].getId();
  }
  
  public int saveSalary(int x){
    return personArr[x].getSalary();
  }

  public int dataNum(){
    return personArr.length;
  }
}

如前所述,我尝试将 saveData 放入 CPersonAccount 类中,但会显示 IOException。 原来的练习材料是五笔。为了测试,我把数据改成了一笔。

我现在想问一下是否还有其他方法可以调整我导出档案的方式。 那我应该如何设计读取存档的功能呢

我根据评论做了一些更正。

case 'S':
  FileOutputStream fo = new 
  FileOutputStream("C:\\myJava\\exercise\\ch12\\file\\ex6.tmp");
  ObjectOutputStream os = new ObjectOutputStream(fo);
   for(int i=0;i<obj.dataNum();i++){
       String a = obj.saveName(i);
       String b = obj.saveDegree(i);
       String c = obj.saveId(i);
       int d = obj.saveSalary(i);
       os.writeObject(new CPersonAccount(a,b,c,d));
   }

class CPersonAccount implements Serializable{
  CPersonData personArr[] = new CPersonData[1];
  BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
  String a,b,c;
  int d;

  public CPersonAccount(){}

  public CPersonAccount(String st1,String st2,String st3,int in4){
    a = st1;
    b = st2;
    c = st3;
    d = in4;
    for(int i=0;i<personArr.length;i++){
      personArr[i]= new CPersonData(a,b,c,d);
    }
  }

但是,这种方法又出现了新的问题。 enter image description here

java serialization
1个回答
0
投票
    import java.io.*;
import java.util.Scanner;

class CPersonData implements Serializable {
    public String name;
    public String degree;
    private String p_id;
    private int salary;

    public CPersonData() {
        name = "~~~~~~~~";
        degree = "~~~~~~~~";
        salary = 0;
    }

    public CPersonData(String a, String b, String c, int d) {
        name = a;
        degree = b;
        p_id = c;
        salary = d;
    }

    public int getSalary() {
        return salary;
    }

    public String getId() {
        return p_id;
    }

    public void show() {
        System.out.print(name + "\t");
        System.out.print(degree + "\t");
        System.out.println(salary);
    }
}

class CPersonAccount implements Serializable {
    CPersonData personArr[] = new CPersonData[1];
    BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
    String a, b, c;
    int d;

    public CPersonAccount() {
    }

    public void inputData() throws IOException {
        for (int i = 0; i < personArr.length; i++) {
            while (true) {
                try {
                    System.out.println("請輸入員工姓名");
                    a = buf.readLine();
                    break;
                } catch (Exception e) {
                    System.out.println("錯誤,請重新輸入");
                }
            }
            while (true) {
                try {
                    System.out.println("請輸入員工職別");
                    b = buf.readLine();
                    break;
                } catch (Exception e) {
                    System.out.println("錯誤,請重新輸入");
                }
            }
            while (true) {
                try {
                    System.out.println("請輸入員工ID");
                    c = buf.readLine();
                    break;
                } catch (Exception e) {
                    System.out.println("錯誤,請重新輸入");
                }
            }
            while (true) {
                try {
                    System.out.println("請輸入員工薪資");
                    d = Integer.parseInt(buf.readLine());
                    break;
                } catch (Exception e) {
                    System.out.println("錯誤,請重新輸入");
                }
            }
            personArr[i] = new CPersonData(a, b, c, d);
        }
    }

    public void displayData() {
        CPersonData tit = new CPersonData();
        tit.show();
        for (int i = 0; i < personArr.length; i++) {
            System.out.print(personArr[i].name + "\t");
            System.out.print(personArr[i].degree + "\t");
            System.out.println(personArr[i].getSalary());
        }
    }

    public void saveData(String filePath) throws IOException {
        FileOutputStream fo = new FileOutputStream(filePath);
        ObjectOutputStream os = new ObjectOutputStream(fo);
        os.writeObject(this); // Write the entire object to the file
        os.close();
        fo.close();
    }

    public static CPersonAccount loadData(String filePath) throws IOException, ClassNotFoundException {
        FileInputStream fi = new FileInputStream(filePath);
        ObjectInputStream oi = new ObjectInputStream(fi);
        CPersonAccount obj = (CPersonAccount) oi.readObject(); // Read the object from the file
        oi.close();
        fi.close();
        return obj;
    }

    public int dataNum() {
        return personArr.length;
    }
}

public class ex12_06 {
    public static void main(String args[]) throws IOException {
        CPersonAccount obj = new CPersonAccount();
        char runFunc = 'd';
        Scanner keyboardInput = new Scanner(System.in);

        while (runFunc != 'q') {
            System.out.print("請選擇作業");
            System.out.print("(i=輸入資料 s=依月薪資排序 d=顯示資料 q=離開 S=存檔 L=讀檔):");
            runFunc = keyboardInput.nextLine().charAt(0);
            switch (runFunc) {
                case 'i':
                    obj.inputData();
                    break;
                case 's':
                    obj.sortBySalary();
                    break;
                case 'd':
                    obj.displayData();
                    break;
                case 'S':
                    obj.saveData("C:\\myJava\\exercise\\ch12\\file\\ex6.tmp");
                    break;
                case 'L':
                    obj = CPersonAccount.loadData("C:\\myJava\\exercise\\ch12\\file\\ex6.tmp");
                    break;
                default:
                    break;
            }
        }
    }
}

在这里你可以看到代码说明

1- CPersonData 和 CPersonAccount 类现在实现 Serialized 接口以支持序列化。 2- CPersonAccount 中的 saveData() 方法现在将整个对象而不是单个字段保存到文件中。 3-在 CPersonAccount 中添加了 loadData() 方法以从文件加载对象。 4-修改了 main 方法以包含从文件加载数据的选项(L 选项)。 5- 为反序列化期间的 IO 操作和类转换添加了异常处理。

© www.soinside.com 2019 - 2024. All rights reserved.