从Java中删除文本文件中的特定行

时间:2015-11-13 20:13:58

标签: java text line

我正在建立一个排名系统,其中每个成员都有一个用户名和一个排名。程序从文本文件中读取用户名和排名,并将其分配给用户。 每行一个用户名和排名,例如:

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;

3 个答案:

答案 0 :(得分:1)

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

另一种解决方案是:

  1. FileChannel
  2. 打开RandomAccessFile
  3. 逐行读取文件并保留行头的文件指针。 fileChannel.position();file.readLine();将之后的内容加载到集合中。从该位置file.setLength(linePosition);截断文件,然后将collection转储到文件末尾。
  4. 如果您的数据不适合内存,则可以使用temp file代替集合。创建temp-file File.createTempFile(...),逐行读取剩余数据并写入temp,截断原始文件,读取临时行并写入原始文件。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

将文件读入某个Collection,删除所需的用户并使用修改后的Collection重写该文件。