0

ArrayListをファイルにシリアル化するのを手伝ってくれるかどうか疑問に思っています。現在、私は学校からの要約に取り組んでいますが、私が抱えている実際のコーディングの問題はありません。私が作成しているのはGUIアドレスブックであり、ユーザーがアドレスを追加すると、そのアドレスは配列リストに格納され、コンボボックスに追加されます。それが私がしていることです。私が求めているのは、アレイリストをシリアル化できるかどうかです。できれば、どうやって教えてもらえますか?または、少なくともいくつかのチュートリアルを教えてください。

どうもありがとう。回答する前にコードを確認する必要がある場合は、お知らせください。表示します。繰り返しになりますが、どうもありがとうございました。

これが私のコード全体です。

import java.awt.EventQueue;


public class Address_Book {

    private JFrame frame;
    private JTextField newName;
    private JTextField newAddress;
    private JTextField newPhoneAddress;
    ArrayList<Book> test = new ArrayList<Book>();

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Address_Book window = new Address_Book();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public Address_Book() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 371, 262);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        final JComboBox comboBox = new JComboBox();
        final DefaultComboBoxModel model = new DefaultComboBoxModel();

        newName = new JTextField();
        newName.setBounds(10, 29, 79, 20);
        frame.getContentPane().add(newName);
        newName.setColumns(10);

        JLabel lbl1 = new JLabel("Enter New Name:");
        lbl1.setBounds(10, 11, 107, 14);
        frame.getContentPane().add(lbl1);

        JLabel lbl2 = new JLabel("Enter New Address:");
        lbl2.setBounds(110, 11, 107, 14);
        frame.getContentPane().add(lbl2);

        newAddress = new JTextField();
        newAddress.setColumns(10);
        newAddress.setBounds(109, 29, 96, 20);
        frame.getContentPane().add(newAddress);

        newPhoneAddress = new JTextField();
        newPhoneAddress.setColumns(10);
        newPhoneAddress.setBounds(215, 29, 130, 20);
        frame.getContentPane().add(newPhoneAddress);

        JLabel lbl3 = new JLabel("Enter New Phone number:");
        lbl3.setBounds(215, 11, 140, 14);
        frame.getContentPane().add(lbl3);

        JButton btnAddNewContact = new JButton("Add new contact");
        btnAddNewContact.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent arg0) {
                test.add( (new Book(newName.getText(), newAddress.getText(), newPhoneAddress.getText())));
                //mergesort.mergesort(test, 0, test.size() - 1);
                model.removeAllElements();
                for(int i=0; i < test.size();i++){
                    model.addElement(test.get(i).getContact()); 
                }
                comboBox.setModel(model);
                newName.setText(""); 
                newAddress.setText("");
                newPhoneAddress.setText("");
            }
        });
        btnAddNewContact.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
            }
        });
        btnAddNewContact.setBounds(10, 53, 335, 23);
        frame.getContentPane().add(btnAddNewContact);

        JLabel lbl4 = new JLabel("Current Contacts:");
        lbl4.setBounds(10, 87, 107, 14);
        frame.getContentPane().add(lbl4);

        comboBox.setModel(model);
        comboBox.setBounds(10, 101, 335, 20);
        comboBox.setSelectedIndex(test.size()-1);
        frame.getContentPane().add(comboBox);
    }
}

そしてここに私のオブジェクトがあります:

public class Book implements Comparable {
     private String flName, Address, pNumber;

    public Book(String Name, String address, String phoneNumber ){
        setFlName(Name);
        setAddress(address);
        setpNumber(phoneNumber);
    }

    public String getpNumber() {
        return pNumber;
    }

    public void setpNumber(String pNumber) {
        this.pNumber = pNumber;
    }

    public String getAddress() {
        return Address;
    }

    public void setAddress(String address) {
        Address = address;
    }

    public String getFlName() {
        return flName;
    }

    public void setFlName(String flName) {
        this.flName = flName;
    }  

    public String getContact() {
        return flName + " " + Address + " " + pNumber;
    }

    public int compareTo(Object c) {
        Book testBook = (Book)c;

        if (testBook.getFlName().compareTo(this.getFlName()) < 0){
            return(-1);
        }else if(testBook.getFlName().compareTo(this.getFlName()) == 0){
            return(0);
        }else{
            return(1);
        }
    }

}

繰り返しになりますが、アレイリストをシリアル化できるようにする方法がわかりません。私はオブジェクトを使用しましたが、アレイリストは使用していません。そのため、同じプロセスであるかどうかはわかりません。私は単にアドバイス、またはArrayListsをシリアル化可能にするためのいくつかの素晴らしいチュートリアルを求めています。

4

2 に答える 2

4

こちらArrayListドキュメントから:

実装されているすべてのインターフェイス: Serializable、Cloneable、Iterable、Collection、List、RandomAccess

そうです、それはシリアル化可能です。Javaで他のストリームを使用するのと同じように、それを行うのは非常に簡単です。を見てObjectOutputStreamくださいObjectInputStream

于 2012-06-14T00:21:28.903 に答える
4

使用ObjectInputStreamしてObjectOutputStream、次のようなものを使用します。

public static void saveArrayListToFile(ArrayList<Book> books, String filePath)
{
    ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(filePath)));
    oos.writeObject(books);
    oos.close();
}

// ...

public static ArrayList<Book> loadArrayListFromFile(String filePath)
{
    ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream(filePath)));
    try
    {
        return (ArrayList<Book>) ois.readObject();
    }
    finally
    {
        ois.close();
    }
}

BookクラスはSerializableインターフェースを実装する必要があることに注意してください。コードをテストしませんでしたが、動作するはずです。上記のコードの例外については、try-catchが必要になる場合があります。

于 2012-06-14T00:25:59.307 に答える