Contact Management System in Java

Introduction

A Contact Management System is a practical Java project that demonstrates core programming concepts such as object-oriented design, collections, file I/O, user input validation, and CRUD operations (Create, Read, Update, Delete). This console-based application allows users to manage personal or professional contacts with details like name, phone number, email, and address. The system persists data to a file (contacts.csv) for durability across sessions and provides a menu-driven interface for intuitive interaction.


Features

  • Add contacts with name, phone, email, and address
  • View all contacts in a formatted list
  • Search contacts by name or phone number
  • Update existing contacts
  • Delete contacts
  • Save contacts to CSV file on exit
  • Load contacts from CSV file on startup
  • Input validation for phone numbers and emails
  • Menu-driven console interface

Complete Source Code

1. Contact.java – Contact Model Class

// Contact.java
public class Contact {
private String name;
private String phone;
private String email;
private String address;
public Contact(String name, String phone, String email, String address) {
this.name = name;
this.phone = phone;
this.email = email;
this.address = address;
}
// Getters
public String getName() { return name; }
public String getPhone() { return phone; }
public String getEmail() { return email; }
public String getAddress() { return address; }
// Setters
public void setName(String name) { this.name = name; }
public void setPhone(String phone) { this.phone = phone; }
public void setEmail(String email) { this.email = email; }
public void setAddress(String address) { this.address = address; }
@Override
public String toString() {
return String.format("Name: %s%nPhone: %s%nEmail: %s%nAddress: %s%n",
name, phone, email, address);
}
// CSV format: name,phone,email,address
public String toCSV() {
return String.format("%s,%s,%s,%s", name, phone, email, address);
}
public static Contact fromCSV(String csvLine) {
String[] parts = csvLine.split(",", 4); // Split into 4 parts max
if (parts.length == 4) {
return new Contact(parts[0], parts[1], parts[2], parts[3]);
}
return null;
}
}

2. ContactManager.java – Core Logic Class

// ContactManager.java
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;
public class ContactManager {
private List<Contact> contacts;
private static final String FILE_NAME = "contacts.csv";
public ContactManager() {
this.contacts = new ArrayList<>();
loadContacts();
}
public void addContact(String name, String phone, String email, String address) {
contacts.add(new Contact(name, phone, email, address));
System.out.println("Contact added successfully.");
}
public void viewAllContacts() {
if (contacts.isEmpty()) {
System.out.println("No contacts found.");
return;
}
for (int i = 0; i < contacts.size(); i++) {
System.out.println((i + 1) + ".\n" + contacts.get(i));
}
}
public void searchContacts(String query) {
boolean found = false;
query = query.toLowerCase();
for (Contact contact : contacts) {
if (contact.getName().toLowerCase().contains(query) ||
contact.getPhone().contains(query)) {
System.out.println(contact);
found = true;
}
}
if (!found) {
System.out.println("No contacts found matching: " + query);
}
}
public void updateContact(int index, String name, String phone, String email, String address) {
if (isValidIndex(index)) {
Contact contact = contacts.get(index);
contact.setName(name);
contact.setPhone(phone);
contact.setEmail(email);
contact.setAddress(address);
System.out.println("Contact updated successfully.");
} else {
System.out.println("Invalid contact number.");
}
}
public void deleteContact(int index) {
if (isValidIndex(index)) {
contacts.remove(index);
System.out.println("Contact deleted.");
} else {
System.out.println("Invalid contact number.");
}
}
private boolean isValidIndex(int index) {
return index >= 0 && index < contacts.size();
}
public void saveContacts() {
try (PrintWriter writer = new PrintWriter(new FileWriter(FILE_NAME))) {
for (Contact contact : contacts) {
writer.println(contact.toCSV());
}
System.out.println("Contacts saved to " + FILE_NAME);
} catch (IOException e) {
System.err.println("Error saving contacts: " + e.getMessage());
}
}
private void loadContacts() {
if (!Files.exists(Paths.get(FILE_NAME))) return;
try (BufferedReader reader = new BufferedReader(new FileReader(FILE_NAME))) {
String line;
while ((line = reader.readLine()) != null) {
Contact contact = Contact.fromCSV(line);
if (contact != null) {
contacts.add(contact);
}
}
System.out.println("Loaded " + contacts.size() + " contacts from " + FILE_NAME);
} catch (IOException e) {
System.err.println("Error loading contacts: " + e.getMessage());
}
}
}

3. InputValidator.java – Utility Class for Validation

// InputValidator.java
import java.util.regex.Pattern;
public class InputValidator {
private static final String PHONE_PATTERN = "^\\+?[0-9]{10,15}$";
private static final String EMAIL_PATTERN = 
"^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@" +
"(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$";
public static boolean isValidPhone(String phone) {
return Pattern.matches(PHONE_PATTERN, phone.trim());
}
public static boolean isValidEmail(String email) {
return Pattern.matches(EMAIL_PATTERN, email.trim());
}
}

4. Main.java – Application Entry Point

// Main.java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
ContactManager manager = new ContactManager();
Scanner scanner = new Scanner(System.in);
boolean running = true;
System.out.println("=== Contact Management System ===");
while (running) {
System.out.println("\nChoose an option:");
System.out.println("1. Add Contact");
System.out.println("2. View All Contacts");
System.out.println("3. Search Contact");
System.out.println("4. Update Contact");
System.out.println("5. Delete Contact");
System.out.println("6. Exit");
System.out.print("Enter your choice: ");
String choice = scanner.nextLine().trim();
switch (choice) {
case "1":
addContact(scanner, manager);
break;
case "2":
manager.viewAllContacts();
break;
case "3":
searchContact(scanner, manager);
break;
case "4":
updateContact(scanner, manager);
break;
case "5":
deleteContact(scanner, manager);
break;
case "6":
manager.saveContacts();
System.out.println("Goodbye!");
running = false;
break;
default:
System.out.println("Invalid choice. Please enter 1-6.");
}
}
scanner.close();
}
private static void addContact(Scanner scanner, ContactManager manager) {
System.out.print("Enter name: ");
String name = scanner.nextLine().trim();
if (name.isEmpty()) {
System.out.println("Name cannot be empty.");
return;
}
System.out.print("Enter phone: ");
String phone = scanner.nextLine().trim();
if (!InputValidator.isValidPhone(phone)) {
System.out.println("Invalid phone number. Use 10-15 digits (optional + prefix).");
return;
}
System.out.print("Enter email: ");
String email = scanner.nextLine().trim();
if (!email.isEmpty() && !InputValidator.isValidEmail(email)) {
System.out.println("Invalid email format.");
return;
}
System.out.print("Enter address: ");
String address = scanner.nextLine().trim();
manager.addContact(name, phone, email, address);
}
private static void searchContact(Scanner scanner, ContactManager manager) {
System.out.print("Enter name or phone to search: ");
String query = scanner.nextLine().trim();
if (!query.isEmpty()) {
manager.searchContacts(query);
} else {
System.out.println("Search query cannot be empty.");
}
}
private static void updateContact(Scanner scanner, ContactManager manager) {
manager.viewAllContacts();
if (manager.contacts.isEmpty()) return;
System.out.print("Enter contact number to update: ");
if (!scanner.hasNextInt()) {
System.out.println("Invalid input. Please enter a number.");
scanner.nextLine(); // Clear invalid input
return;
}
int index = scanner.nextInt() - 1;
scanner.nextLine(); // Consume newline
System.out.print("Enter new name: ");
String name = scanner.nextLine().trim();
if (name.isEmpty()) {
System.out.println("Name cannot be empty.");
return;
}
System.out.print("Enter new phone: ");
String phone = scanner.nextLine().trim();
if (!InputValidator.isValidPhone(phone)) {
System.out.println("Invalid phone number.");
return;
}
System.out.print("Enter new email: ");
String email = scanner.nextLine().trim();
if (!email.isEmpty() && !InputValidator.isValidEmail(email)) {
System.out.println("Invalid email format.");
return;
}
System.out.print("Enter new address: ");
String address = scanner.nextLine().trim();
manager.updateContact(index, name, phone, email, address);
}
private static void deleteContact(Scanner scanner, ContactManager manager) {
manager.viewAllContacts();
if (manager.contacts.isEmpty()) return;
System.out.print("Enter contact number to delete: ");
if (!scanner.hasNextInt()) {
System.out.println("Invalid input. Please enter a number.");
scanner.nextLine(); // Clear invalid input
return;
}
int index = scanner.nextInt() - 1;
scanner.nextLine(); // Consume newline
manager.deleteContact(index);
}
}

How It Works

1. Data Model

  • The Contact class encapsulates contact details and provides CSV serialization.
  • toCSV() and fromCSV() enable file persistence.

2. Core Logic

  • ContactManager handles all CRUD operations and file I/O.
  • Contacts are stored in an ArrayList<Contact> for dynamic management.

3. File Format

  • Data is stored in contacts.csv with comma-separated values:
  Alice,+1234567890,[email protected],123 Main St
Bob,+0987654321,[email protected],456 Oak Ave

4. Validation

  • InputValidator uses regex to ensure:
  • Phone numbers: 10–15 digits, optional + prefix
  • Emails: Standard email format

5. User Interaction

  • Menu-driven interface with clear prompts.
  • Input validation prevents invalid data entry.
  • Graceful handling of empty lists and invalid indices.

Sample Output

=== Contact Management System ===
Loaded 1 contacts from contacts.csv
Choose an option:
1. Add Contact
2. View All Contacts
3. Search Contact
4. Update Contact
5. Delete Contact
6. Exit
Enter your choice: 2
1.
Name: Alice
Phone: +1234567890
Email: [email protected]
Address: 123 Main St
Choose an option:
1. Add Contact
2. View All Contacts
3. Search Contact
4. Update Contact
5. Delete Contact
6. Exit
Enter your choice: 3
Enter name or phone to search: Alice
Name: Alice
Phone: +1234567890
Email: [email protected]
Address: 123 Main St
Choose an option:
1. Add Contact
2. View All Contacts
3. Search Contact
4. Update Contact
5. Delete Contact
6. Exit
Enter your choice: 6
Contacts saved to contacts.csv
Goodbye!

Key Concepts Demonstrated

ConceptImplementation
Object-Oriented DesignContact class with encapsulation
CollectionsArrayList<Contact> for dynamic storage
File I/OCSV read/write with BufferedReader/PrintWriter
User InputScanner with validation
CRUD OperationsAdd, view, search, update, delete
Error HandlingTry-catch for I/O, input validation
Regular ExpressionsPhone/email validation
Menu SystemLoop with switch-case

Possible Enhancements

  • Unique ID generation: Add auto-incrementing contact IDs
  • Sorting: Sort contacts by name or other fields
  • Categories/Groups: Tag contacts (e.g., family, work)
  • GUI version: Use JavaFX or Swing
  • Database storage: Replace CSV with SQLite or MySQL
  • Import/Export: Support vCard (.vcf) format
  • Duplicate detection: Prevent adding identical contacts

Best Practices Applied

  • Single Responsibility: Each class has one clear purpose
  • Input validation: Prevents invalid data entry
  • Resource management: Scanner and file streams properly closed
  • Meaningful names: Clear variable and method names
  • Persistence: Data survives application restarts
  • User feedback: Clear success/error messages
  • Modular design: Separation of concerns (model, logic, UI)

Conclusion

This Contact Management System provides a comprehensive foundation for learning Java fundamentals while building a functional application. It demonstrates how to structure code using OOP principles, manage data with collections, persist state with file I/O, validate user input, and create an interactive user experience. The modular design makes it easy to extend with new features, and the error handling ensures robustness. Whether used as a learning exercise or a starting point for a more advanced address book application, this project reinforces core Java skills that are applicable to real-world development.

Leave a Reply

Your email address will not be published. Required fields are marked *


Macro Nepal Helper