2009-12-29 118 views
1

我運營一個小型在線遊戲社區並處理賬戶數據庫。搜索和顯示結果[java]

的設置是這樣的:一個名爲

文件夾帳戶 裏面的帳戶目錄中,有一個由玩家名稱組織200,000+的文本文件。手動訪問此文件夾是一件痛苦的事情,因爲需要使用RAM來搜索和搜索文件。我覺得這很不方便。

我訪問這個目錄來發送密碼提示或誰打得最長的高分。

以下是一個帳戶文件的示例。這個文件被命名的Falcon.txt

[ACCOUNT] 
character-username = Falcon 
character-password = falconpassword 

[INFO] 
character-coordx = 3252 
character-coordy = 3432 
character-active = yes 
character-ismember = 1 
character-messages = 5 
character-lastconnection = [removed] 
character-lastlogin = 2009-11-29 
character-energy = 100 
character-gametime = 193 
character-gamecount = 183 

[EQUIPMENT] 
character-equip = 0 4724 0 
character-equip = 1 1052 0 
character-equip = 2 6585 0 
character-equip = 3 4151 0 
character-equip = 4 4720 0 
character-equip = 5 1215 0 
character-equip = 6 -1 0 
character-equip = 7 4722 0 
character-equip = 8 -1 0 
character-equip = 9 775 0 
character-equip = 10 1837 0 
character-equip = 11 -1 0 
character-equip = 12 6735 0 
character-equip = 13 -1 0 

[APPEARANCE] 
character-look = 0 1 
character-look = 1 1 
character-look = 2 2 
character-look = 3 3 
character-look = 4 5 
character-look = 5 2 

[STATS] 
character-skill = 0 1 0 
character-skill = 1 1 0 
character-skill = 2 1 0 
character-skill = 3 1 0 
character-skill = 4 1 0 
character-skill = 5 1 0 
character-skill = 6 1 0 
character-skill = 7 1 0 
character-skill = 8 1 0 
character-skill = 9 1 0 
character-skill = 10 1 0 
character-skill = 11 1 0 
character-skill = 12 1 0 
character-skill = 13 1 0 
character-skill = 14 1 0 
character-skill = 15 1 0 
character-skill = 16 1 0 
character-skill = 17 1 0 
character-skill = 18 1 0 
character-skill = 19 1 0 
character-skill = 20 1 0 

[ITEMS] 

[BANK] 

[FRIENDS] 

[IGNORES] 

[END] 

這是一個巨大的數據庫,通過在值的文件目錄中進行搜索。

值我的意思是通過條目ID或IP地址來查找和跟蹤其他帳戶。

但是,我有一個新的問題,我的發展是崩潰。

正如您在文件中看到的那樣,行按標籤組織。

character-equip = 0 4724 1 

如果我把值4724放在我的搜索應用程序中,我希望它打印出找到的搜索結果右側的值1標籤。我希望它只打印出找到的結果的值,而不是額外的結果。

所以搜索看起來是這樣的:

1 「輸入項目找到:」
2: 「賬戶Falcon.txt具有1」 「輸入項尋4724」
按任意鍵繼續......

,或者出現向具備項目

character-equip = 5 1239 102 

1.生產更多的數量「中輸入項目找到:」
2.「輸入項尋: 1239「
3.」帳戶Falcon2.txt有102!「
按任意鍵繼續...

我只是想輸入一個項目ID,並讓它顯示找到的值後的值。白色空間是一個選項卡。我試過這樣做,獲得任何結果的唯一成功方法是在搜索詞之間插入一個製表符。所以,如果我想找到的CMD線項目1239 ID類型此:

Enter item to find:<tab>1239<tab> 

它將然後搜索並顯示在它該項目的賬戶。但是,我仍然需要單獨打開帳戶來查找該項目的數量。如果找到該值,我希望搜索結果顯示該項目的數量。但是,如果該值是一個數量,它試圖搜索一個標籤,我希望它可以跳過它或說零。

這就是我的意思。

character-equip = 0 1024 1239 

Enter item to find: 1239 

如果它擊中這個賬戶我要讓搜索結果顯示爲零,如果它不能使用Tab鍵或查看空白的任何值。所以它會顯示爲空或零 帳戶Falcon3.txt爲空!

Account Falcon3.txt has 0! 

我已經嘗試這樣做,但我不能確定如何實現這一目標。

這是我的代碼。

import java.io.*; 
import java.util.*; 

public class ItemDatabase { 

    public static void main(String args[]) { 

     System.out.print("Enter item to find: "); 
     Scanner sc = new Scanner(System.in); 
     find(sc.nextLine()); 
    } 

    public static void find(String delim) { 
     File dir = new File("accounts"); 
     if (dir.exists()) { 
      String read; 
      try { 
       File files[] = dir.listFiles(); 
       for (int i = 0; i < files.length; i++) { 
        File loaded = files[i]; 
        if (loaded.getName().endsWith(".txt")) { 
         BufferedReader in = new BufferedReader(new FileReader(loaded)); 
         StringBuffer load = new StringBuffer(); 
         while ((read = in.readLine()) != null) { 
          load.append(read + "\n"); 
         } 
         String delimiter[] = new String(load).split(delim); 

         if(delimiter.length > 1) { 
         System.out.println("Account " + loaded.getName() + "has " + delimiter[1] + "!"); 
         } 
        } 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } else { 
      System.out.println("error: dir wasn't found!"); 
     } 
    } 
} 

謝謝你們,我希望你能幫助我。

+0

200.000帳戶!您將文件集合稱爲數據庫,是否有一個原因,您爲什麼沒有設置數據庫來保存所有這些數據?如果你這樣做了,這個搜索將是系統的一個幾乎隱含的功能。 – rsp 2009-12-29 09:52:02

+0

rsp:有時開發這些東西開始作爲個人愛好項目的朋友,然後它只是有點爆炸的大小。很少有準備工作在他們的愛好項目中大量使用。 – Esko 2009-12-29 11:22:03

回答

6

這只是爲數據庫而哭泣。如果您的整個後端運行在一個單獨的java進程中,我建議使用Apache DerbyH2之類的東西。

如果您不想移動到數據庫,並且主要問題是將所有條目列在單個目錄中,您是否可以將其分割成層次結構:您的Falcon帳戶可以位於F/FA/Falcon.txt中 - 每個目錄將包含更多可管理的文件數量。

+0

當我閱讀並向下滾動時,我大喊:「使用數據庫!」然後我看到你的評論!真棒! +1 – les2 2009-12-29 10:32:36

+0

感謝您的建議,我將嘗試爲此創建一個SQL數據庫並擺脫文本文件。 – 2009-12-29 10:42:05

0

除了需要一個數據庫之外,您可以使用命令行實用程序(如find,grep等)或文本處理語言(如perl)來更直觀,更輕鬆地實現您的解決方案。

也許

grep '[0-9]+\t[0-9]+\t1239' Account_Falcon3.txt 

將返回

character-equip = 0 1024 1239 

然後,您可以很容易地看到該值用於該項目爲0。

我不能強調需要而不是編寫一個Java程序來做到這一點 - 你不會像標準shell實用程序的作者那樣做得很好。讓我們面對現實,你提出這個問題的事實表明你是一個新手! :)(根據主題,我們都是新手)。

+0

哇謝謝你哈哈我是一個肯定的小菜!你讓我高興起來=) 謝謝我真的不想安裝一個數據庫,這將工作完美!謝謝你的朋友哈哈哈非常感謝你讓我度過一天。 =) – 2009-12-29 11:26:20