我只是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();
}
答案 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;
}
}