Reputation: 215
Now I am wondering if you guys could help me on serializing an ArrayList onto a file. Now I am working on a summative from school, however there is no real coding problem I am having. What I am making is a GUI address book, and when a user adds an address it is stored into an arraylist and added to the comboBox. That is what I am doing. What I am asking is if you can serialize Arraylists. If you can, can you guys teach me how? Or at the very least give me some tutorials?
Thank you so much. If you guys need to see code before answering, just let me know and I will show it. Again, thank you so much.
Okay here is my entire code:
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);
}
}
and here is my object:
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);
}
}
}
Now, again, I am unsure of how to proceed to make Arraylists serializable. I have used objects, but not Arraylists, so I do not know whether or not it is the same process. I am just merely asking for advice, or some great tutorials on making ArrayLists serializable.
Upvotes: 0
Views: 4253
Reputation: 133557
From the ArrayList
documentation here:
All Implemented Interfaces: Serializable, Cloneable, Iterable, Collection, List, RandomAccess
So yes, it's serializable. Doing it is quite easy as using any other stream in Java, just take a look at ObjectOutputStream
and at ObjectInputStream
.
Upvotes: 4
Reputation: 117579
Use ObjectInputStream
and ObjectOutputStream
, something like:
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();
}
}
Note that Book
class must implements Serializable
interface. I did not test the code, but it should work. You may need to try-catch for any exceptions in the code above.
Upvotes: 4