2011-12-11 93 views
0

我做了一个小的通讯录程序,允许用户:地址簿程序

  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

你可以用你的逻辑在while循环终止当给定boolean是真实的,因此在执行每次操作后,你会继续下去,回到开始。例如:

boolean isRunning = true; 

while (isRunning) { 
    //your code here 

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

你也应该把所有你的逻辑出main()和到从main()称为自己的独立功能。我也不确定你为什么写入.bat文件?如果要写入.dat文件,请将扩展名更改为.dat。

+0

你是什么意思从main()? –

+0

'public static void main(String [] args)'是应用程序的入口点。它不是用逻辑来膨胀它,而是把它分离出来(使用对象或方法)。 – Deco

+0

也我似乎无法得到删除联系人部分工作? –

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.对于基于“Ple选择所需的操作“,练习执行switch块。

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

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

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

7.询问你是否有任何问题:) –