具有更多功能的地址簿程序

时间:2011-12-11 21:08:53

标签: java addressbook

我做了一个小型地址簿程序,允许用户:

  1. 添加联系人
  2. 搜索联系人
  3. 删除联系人
  4. 显示所有联系人
  5. 在您输入一个选项后结束,我希望它继续运行,直到用户说例如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 个答案:

答案 0 :(得分:1)

您可以将逻辑包装在while循环中,该循环在给定boolean为真时终止,因此您将在执行每个操作后继续返回到开始。例如:

boolean isRunning = true;

while (isRunning) {
  //your code here

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

您还应该将所有逻辑从main()移出并转移到从main()调用的自己的单独函数中。我也不确定你为什么要写一个.bat文件?如果要写入.dat文件,请将扩展名更改为.dat。

答案 1 :(得分:0)

我想你只想要一般的代码审查。以下是我的想法:

1。 Scanner更容易用于控制台输入,因为您可以指定输入类型,例如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. 将临时文件重命名为文件名。