2009-12-29 111 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