2011-12-11 170 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.詢問你是否有任何問題:) –