Как распечатать информацию о классе в консолях - PullRequest
1 голос
/ 20 июня 2020

Когда я запускаю этот код, файл хорошо сохраняется, но я думаю, что при вводе постоянно появляются ошибки. Кажется, нет проблем с подключением FileStream и ObjectStream, поэтому мне интересно, что за проблема с кодом, который я сделал. Как напечатать имя класса в файле на консолях? Спасибо за чтение и извините, что я не очень хорошо владею английским языком sh

import java.io.*;
import java.util.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

class Person  implements Serializable{
    String name;
    String tel;
    int age;

    public Person(String name, String tel, int age) {
        this.name = name;
        this.tel = tel;
        this.age = age;
    }
    public String toString() { return "{"+name+","+tel+","+age+"}";}
}

public class Address extends JFrame{
    JLabel l1,l2,l3;
    JButton b1,b2,b3,b4,b5;
    JTextField t1,t2,t3;
    JPanel p1,p2;
    Vector<Person> ps = new Vector<Person>();

    public Address()  {
        setSize(600,150);
        setTitle("Address");

        p1 = new JPanel();

        l1 = new JLabel("이름:");
        t1 = new JTextField(15);

        l2 = new JLabel("전화번호:");
        t2 = new JTextField(15);

        l3 = new JLabel("나이:");
        t3 = new JTextField(15);

        p1.add(l1);
        p1.add(t1);
        p1.add(l2);
        p1.add(t2);
        p1.add(l3);
        p1.add(t3);

        p1.setLayout(new GridLayout(1,0));

        p2 = new JPanel();

        b1 = new JButton("입력");
        b1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                ps.add(new Person(t1.getText(), t2.getText(), Integer.parseInt(t3.getText()) ));
            }
        });
        b2 = new JButton("자료읽기");
        b2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                ObjectInputStream in = null;
                try {
                    in = new ObjectInputStream(new FileInputStream("C:\\Users\\조의수\\Desktop\\JavaTest\\Person.dat"));
                    Person per = (Person)in.readObject();
                    System.out.println(per);
                    in.close();
                }catch(ClassNotFoundException | IOException e1) {
                    e1.printStackTrace();
                }

            }
        });


        b3 = new JButton("자료저장");
        b3.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e)  {
                ObjectOutputStream out = null;
                try {

                    for(Person p : ps) {
                        out = new ObjectOutputStream(new FileOutputStream("C:\\Users\\조의수\\Desktop\\JavaTest\\Person.dat"));
                        out.writeObject(ps);
                        out.flush();
                    }

                    out.close();
                } catch(IOException e2) {
                    e2.printStackTrace();
                }

            }
        });
        b4 = new JButton("자료찾기");
        b4.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e)  {

            }
        });
        b5 = new JButton("종료");
        b5.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

            }
        });

        p2.add(b1);
        p2.add(b2);
        p2.add(b3);
        p2.add(b4);
        p2.add(b5);

        p2.setLayout(new GridLayout(1,0));

        add(p1, BorderLayout.NORTH);
        add(p2, BorderLayout.SOUTH);

        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }
    public static void main(String[] args) throws IOException {

        new Address();

    }
}

1 Ответ

0 голосов
/ 20 июня 2020

Проблема

Когда вы пишете свои Object циклы, вам не нужен for цикл, вы пишете их целиком Vector:

for(Person p : ps) { // <-- no need, we already have all Person objects in Vector
    out = new ObjectOutputStream(new FileOutputStream("..."));
    out.writeObject(ps);
    out.flush();
}

и вы читаете их:

in = new ObjectInputStream(new FileInputStream("..."));
Person per = (Person)in.readObject(); // <-- We have stored and read Vector here not Person
System.out.println(per);
in.close();
 

вы в основном пытаетесь преобразовать сохраненные Vector (из Person) в Person, что недопустимо.

Исправить

Исправить запись процедура, как предложено выше:

try {
    out = new ObjectOutputStream(new FileOutputStream("..."));
    out.writeObject(ps); // Write whole vector at once
    out.flush();
}
out.close();

Для чтения процедура не преобразуется в Person но для Vector вот так:

Vector<Person> per = (Vector) in.readObject(); // Read whole saved Vector at once

Теперь вы загрузите все сохраненные Person объекты в per.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...