使用Java从文件中删除一行

时间:2018-10-29 10:24:34

标签: java file

我只是Java编程的初学者,正在尝试编写代码以从Java文件中删除特定行。

在这里,我正在使用扫描仪类读取文件,并使用Printwriter类与FileWriter一起写入临时文件。我想知道我在代码中犯了什么错误。没有语法错误。

此处,“ u”是包含文本的原始文件,而“ t”是将文件内容复制到的临时文件,之后被重命名为原始文件。在函数“ int ldel是要删除的行的索引中。假定文件为:

  aaa
  bbb
  ccc

现在,如果ldel的值传递为2,则文件的格式必须为:

 aaa
 ccc 

我想了很多,找不到一个逻辑错误。请告诉我是否找到一个。编码如下:

void deleteline(int ldel)throws IOException
{
   Scanner dr=new Scanner(u);
   FileWriter fwd= new FileWriter(t,true);
   PrintWriter pd= new PrintWriter(fwd,true);
   int c=0;
   while(dr.hasNextLine()==true)
   {
       c++;
       if(c!=ldel)
       pd.println(dr.nextLine());
       else if(c==ldel)
       continue;

    }
    t.renameTo(u);
    u.delete();
    dr.close();
    fwd.close();
    pd.close();
}     

3 个答案:

答案 0 :(得分:1)

即使您不想输出nextLine(),也应该调用它,否则将在循环的下一次迭代中对其进行处理。

像这样更改循环:

while (dr.hasNextLine()) {
    c++;
    String line = dr.nextLine();
    if (c != ldel) {
        pd.println(line);
    }
}

无需使用continue

我还认为您应该在重命名u之前删除t文件。

答案 1 :(得分:0)

[1]您将名称为“ t”的文件重命名为新名称“ u” ..,然后删除名为“ u”的文件。听起来不对。

[2]当您的'if'跳过nextLine语句时,您根本不会占用任何行,这意味着您仍会在输出文件中获得所有行。因此,即使当c == ldel时,也需要调用.readLine()来摆脱它。

[3]在各种文件系统上,重命名打开的文件不起作用。在重命名之前,应放置关闭调用。

[4]“否则,如果(ldel == c)”是多余的;一个“ else”就可以了。为此,继续是多余的,继续只是意味着在这里结束循环并返回到起点。如果这是循环中的最后一件事,它实际上什么也不做。这是循环中的最后一件事。完全摆脱它。这不会改变您的代码的作用,但确实会使您的代码更易于理解。

[5]打开用于读取/写入的文件时。您应该明确说明字符集。 FileWriter不允许您这样做。不要使用该类。查看新文件API并使用类似Files.newInputStream的东西,请注意,您必须更改大部分代码才能使用新API,这是一个可选的样式建议。

[6]您应该使用try-with-resources构造(如果您不知道这是什么,请在网上搜索'java try-with-resources')。此代码的问题在于,发生异常时,它会泄漏资源。对于一次性应用程序(例如,它先运行,先做一件事,然后退出),这无关紧要,但是,如果将这段代码放在更大的结构中(例如,这是网络服务器的一部分),最终将关闭整个VM。最好尝试通过try-with-resources构造始终打开资源的正确做法。

答案 2 :(得分:0)

尽管代码不是逻辑的最佳实现,但如果要修复代码,则应在nextLine()条件下调用c==ldel方法,以忽略该行。因此,您的循环应如下所示:

   while(dr.hasNextLine()==true)
   {
       c++;
       if(c!=ldel)
           pd.println(dr.nextLine());
       else if(c==ldel)
       {
            dr.nextLine()
            continue;
       }


    }