我已经完成了一个小的通讯录程序,该程序允许用户执行以下操作:

  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();
    }
}

===============>>#1 票数:1

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

boolean isRunning = true;

while (isRunning) {
  //your code here

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

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

===============>>#2 票数:0

我想您只需要常规代码审查。 这是我的想法:

1. 扫描程序更易于用于控制台输入,因为您可以指定输入类型,例如nextInt() 要初始化它,只需使用

Scanner sc = new Scanner(System.in);

您可以在Scanner执行过程中为每个用户输入使用相同的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.对于基于“请选择所需的操作”的条件,请练习实施一个开关块。

5.通过将控制台接口作为单独的类(例如AddressBookUI ,将用于解析用户输入的逻辑和用于在通讯簿上进行操作的逻辑分开。 当它运行时,它应该立即创建AddressBookOperations类的实例,并根据用户输入从那里调用适当的方法AddressBookOperations对于每个操作都应该有一个单独的方法(这也会使您的开关很短)。 它还应该具有以下private (但不是static )变量来存储文件名和BufferedRead / Writer。 该类应具有一个带有String filename参数的构造函数,以初始化这些变量。

6.在Java中,删除文件中的特定行相当棘手。 尝试这个:

  1. 为该文件创建一个BufferedReader
  2. 创建一个新的临时文件,并为其创建一个BufferedWriter
  3. 逐行读取文件。 对于每一行,如果不是您要删除的行,请将其写入临时文件。
  4. 关闭读者和作者
  5. 删除旧文件
  6. 将临时文件重命名为文件名。

  ask by David Needham translate from so

未解决问题?本站智能推荐: