Программа адресной книги с большей функциональностью - PullRequest
0 голосов
/ 12 декабря 2011

Я создал небольшую программу адресной книги, которая позволяет пользователю:

  1. добавить контакт
  2. найти контакт
  3. удалить контакт
  4. показать все контакты

Это заканчивается после ввода одной опции, я хочу, чтобы она продолжала работать, пока пользователь не скажет, например, 5- выход

еще одна проблема, я хочу, чтобы данные записывались ичитать в файл data.dat

Я новичок, могут ли некоторые рассказать мне, как разделить это на отдельные классы и наследовать друг друга.

мой код:

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class AddressBookOperations
{


    public static void main(String[] args) throws IOException
    {
        String s = null;
        String s2 = null;
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

        // Console in = System.console();

        System.out.println(" Please select the required operations.\n"
                        + " 1- Add contact\t 2- search contact\t 3- delete contact\t 4- display all contacts\n");
        s2 = in.readLine();
        if (s2 != null && !(s2.equals("1") || s2.equals("2") || s2.equals("3") || s2.equals("4")))
        {
            System.out.println("Invalid Operation Selected\n");
            System.exit(0);
        }

        else
        {
            s = s2;
        }

        if (s != null)
        {
            String dataLine;
            String data;
            if (s.equals("1")) {
                System.out.println("Name: ");
                dataLine = in.readLine();
                data = dataLine;
                in = new BufferedReader(new InputStreamReader(System.in));
                System.out.println("PhoneNumber: ");
                dataLine = in.readLine();
                data = data + ":" + dataLine;
                writeToFile("C:/AddressBook.bat", data, true, true);
            } else if (s.equals("2")) {
                System.out.println("Enter Name 0r PhoneNumber: ");
                dataLine = in.readLine();
                String result = readFromFile("C:/AddressBook.bat", dataLine);
                System.out.println("Search Results\n" + result);
            } else if (s.equals("3")) {
                System.out.println("Enter Name: ");
                dataLine = in.readLine();
                data = dataLine;
                System.out.println("PhoneNumber: ");
                dataLine = in.readLine();
                data = data + ":" + dataLine;
                deleteFromFile("C:/AddressBook.bat", data);
            } else if (s.equals("4")) {
                String result = readFromFile("C:/AddressBook.bat", null);
                System.out.println("Search Results\n" + result);
            }
        }

    }

    private static void deleteFromFile(String string, String dataLine) {
        String data = readFromFile(string, null);
        data = data.replaceAll(dataLine, "");
        writeToFile(string, data, false, false);
    }

    public static boolean writeToFile(String fileName, String dataLine,
            boolean isAppendMode, boolean isNewLine) {
        if (isNewLine) {
            dataLine = "\n" + dataLine;
        }

        try {
            File outFile = new File(fileName);
            DataOutputStream dos;
            if (isAppendMode) {
                dos = new DataOutputStream(new FileOutputStream(fileName, true));
            } else {
                dos = new DataOutputStream(new FileOutputStream(outFile));
            }

            dos.writeBytes(dataLine);
            dos.close();
        } catch (FileNotFoundException ex) {
            return (false);
        } catch (IOException ex) {
            return (false);
        }
        return (true);

    }

    /*
     * Reads data from a given file
     */
    public static String readFromFile(String fileName, String dataLine2) {
        String DataLine = "";
        String fileData = "";
        try {
            File inFile = new File(fileName);
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    new FileInputStream(inFile)));
            if (dataLine2 != null)
            {
                while ((DataLine = br.readLine()) != null)
                {
                    if (DataLine.contains(dataLine2)) {
                        fileData = DataLine;
                    }
                }
            }

            else
            {
                while ((DataLine = br.readLine()) != null)
                {
                    fileData = fileData + "\n" + DataLine;
                    //System.out.println(DataLine);
                }
            }
            br.close();
        }

        catch (FileNotFoundException ex)
        {
            return (null);
        } catch (IOException ex)
        {
            return (null);
        }
        return (fileData);

    }

    public static boolean isFileExists(String fileName) {
        File file = new File(fileName);
        return file.exists();
    }
}

Ответы [ 2 ]

1 голос
/ 12 декабря 2011

Вы можете заключить свою логику в цикл while, который завершается, когда заданное значение boolean истинно, поэтому вы будете продолжать возвращаться к началу после каждой операции. Например:

boolean isRunning = true;

while (isRunning) {
  //your code here

  if (s2.equals("5")) {
    isRunning = false;
  }
}

Вы также должны переместить всю свою логику из main() в свою отдельную функцию, которая вызывается из main(). Я также не уверен, почему вы пишете в файл .bat? Измените расширение на .dat, если вы хотите записать в файл .dat.

0 голосов
/ 12 декабря 2011

Полагаю, вы просто хотите пересмотреть общий код.Вот мои мысли:

1. Сканер гораздо проще использовать для ввода с консоли, поскольку вы можете указать типы ввода, например nextInt().Чтобы инициализировать его, просто используйте

Scanner sc = new Scanner(System.in);

. Вы можете использовать тот же Scanner для каждого пользовательского ввода в ходе программы.Также не забудьте вызвать Scanner.close() до выхода из вашей программы.

2.Инициализируйте ваш BufferedReader следующим образом:

// file is a String variable
BufferedReader in = new BufferedReader(new FileReader(file));

Аналогично, прочитайте файлы следующим образом:

BufferedWriter br = new BufferedWriter(new BufferedReader(file));

3.Чтобы программа работала, попробуйте реализовать блок do-while :

boolean quit = false;
do {
  // loop program; when user is finished, set quit = true
} while (!quit)

4.Для условных выражений, основанных на «Пожалуйста, выберите необходимые операции», попробуйте реализовать блок switch .

5.Разделите логику анализа пользовательского ввода и логику работы с адресной книгой, сделав интерфейс консоли отдельным классом, скажем, AddressBookUI.Когда он запускается, он должен немедленно создать экземпляр класса AddressBookOperations и вызывать оттуда соответствующие методы на основе пользовательского ввода - AddressBookOperations должен иметь отдельный метод для каждой операции (это также сделает ваш переключатель довольно коротким),Он также должен иметь следующие переменные private (но не static) для хранения имени файла и BufferedRead / Writer.Класс должен иметь конструктор с аргументом String filename, который инициализирует эти переменные.

6.Удаление определенных строк в файлах довольно сложно в Java.Попробуйте это:

  1. Создайте BufferedReader для файла.
  2. Создайте новый временный файл и создайте для него BufferedWriter.
  3. Прочитайтефайл строка за строкой.Для каждой строки, если это не строка, которую вы хотите удалить, запишите ее во временный файл.
  4. Закройте устройство чтения и записи
  5. Удалите старый файл
  6. Переименуйте временный файл в имя файла.
...