2015-11-13 115 views
0

我正在设置一个等级系统,其中每个成员都有一个用户名和一个等级。该程序从文本文件中读取用户名和等级,并将其分配给用户。 一个用户名和每行的排名,如:从Java中的文本文件中删除特定行

user1 1 
user2 2 
user3 3 

我已经设置了一个程序来添加用户名和晋升到文本文件,但我似乎无法弄清楚如何从列表中删除特定用户,例如,如果我只想删除用户2和他/她的等级并离开另外两个等级,然而重要的是之后没有留下空白线。

仅供参考这里是我如何写入文件摆在首位代码:

   try { 
       BufferedWriter out = new BufferedWriter(new FileWriter("stafflist.txt", true)); 
       for (int i = 0; i < 1; i++) { 
       out.newLine(); 
       out.write(target.getUsername() + " " + target.getRights()); 
       } 
      out.close(); 
      SerializableFilesManager.savePlayer(target); 
        if (loggedIn) { 
        target.getPackets().sendGameMessage(modString + Utils.formatPlayerNameForDisplay(member.getUsername()) + "!", true);} 
      member.getPackets().sendGameMessage(successString + Utils.formatMemberNameForDisplay(target.getUsername()) + " to a Moderator.",true); 
      loggedIn = false; 
       } catch (IOException e) { 
       System.out.println("GiveMod - Can't find stafflist.txt"); 
       } 
      return true; 
+0

也许这有助于[在文件中查找并删除它](http://stackoverflow.com/questions/1377279/find-a-line-in-a-file-and-remove-it) –

+0

@亚历山大坎波斯 - 谢谢你,我已经发现,它适用于我的情况,但是我的程序不喜欢删除和重命名临时列表。我需要一些能够修改并保存当前列表的内容,而不是创建一个新列表。 –

+0

说实话,数据库比平面文件要好得多。 – Powerlord

回答

0

似乎有在你的for循环的问题。它在0和1之间循环,所以我认为你发布的输出是不正确的。无论如何,如果你只想打印出某些行,如下所示,你可以将其过滤:

for (int i = 0; i < 1; i++) { 
     if(!target.getUsername().equals("user2")){ 
      out.newLine(); 
      out.write(target.getUsername() + " " + target.getRights()); 
     } 
} 
+0

对不起,我发布的代码仅供参考,它是我用来将数据写入文本文件的方法。我需要一种方法来删除文本。因此,只要假装码心不是有和我有 USER1 1 user2的2 等文本文件,我需要删除只是其中之一,具体的一个,同时还删除空行之后。 –

+0

在这种情况下,我会提到亚历山大坎波斯链接到一个类似的问题 – aengus

+0

此外,你对剩下的用户的排名做什么?例如,如果删除user1,user2的等级仍然为2,而user3的等级为3,那么现在没有用户拥有等级1? – FredK

0

文件读入到一些收藏,删除所需的用户和使用修改后的集合重写文件。

1

无法从文件中间删除数据(无需离开nulls)。你至少需要重写它下面的内容。一个简单的解决方案将加载内存中的所有内容,删除该行并再次转储collection

一种替代的解决方案是:

  1. 打开从RandomAccessFile
  2. 一个FileChannel逐行读取文件中的行,并保持线头部的文件指针。 fileChannel.position();file.readLine();将之后的内容加载到集合中。从该位置截取文件file.setLength(linePosition);,然后在文件末尾转储collection

如果您的数据不适合内存,那么您可以使用temp file而不是集合。创建一个temp-fileFile.createTempFile(...),逐行读取剩余数据并写入temp,截断原始文件,读取temp line并写入原始文件。

或者,猜猜看,使用数据库。