不带数组的递归.IDE会打印正确的输出,而FileWriter不会



对于我的计算基础II类,我需要编写代码来获取字符串,从外部文件中读取,并将其向后写入一个单独的外部文件。只有单词的顺序相反,而不是字符,这些单词仍然可读。我的程序是完整的,只是它没有向后写输出行,但输出行表明它是正确的。我在排除故障时遇到了问题,有人有类似的经历吗?这是我调用的函数:

public static void writeBackwards(String s, int n)
{
try
{
FileWriter fWrite = new FileWriter("newText.txt", true);
BufferedWriter bWrite = new BufferedWriter(fWrite);
PrintWriter outFile = new PrintWriter(bWrite);

StringTokenizer wordsInLine;
wordsInLine = new StringTokenizer(s, " ");
String lastToken = null;
int count = 0;


if(n == 0)
{
outFile.println();                 
}
else
{  
while(count != n && wordsInLine.hasMoreTokens())
{
lastToken = wordsInLine.nextToken();
count++;                              
}

outFile.print("");
outFile.print(lastToken + " ");
System.out.print(lastToken + " ");

writeBackwards(s, n-1);                                                               
}

bWrite.flush();
bWrite.close(); 
}
catch(IOException e)
{
e.getMessage();
}

}   

这是对函数的调用。唯一能打印任何东西的是函数,所以我不知道这有多大帮助。

try
{
FileReader fRead = new FileReader(path); //read file
BufferedReader bRead = new BufferedReader (fRead); //buffer file to read data

line = bRead.readLine();

while(line != null)
{
inLine = new StringTokenizer(line, " ");                        
wordCounter = inLine.countTokens();  
System.out.println(wordCounter);                      

ReverseString.writeBackwards(line, wordCounter);

line = bRead.readLine();
}
bRead.close();
}

catch(IOException e)
{
e.getMessage();
}
}

所以像";短吻鳄和小狗相处不好"应该是";小狗。与"不要短吻鳄"相处;。正如我所说,它在我的控制台(jGrasp(中工作,但它按照输入的顺序写入文件。HALP。编辑:为了记录,我不允许使用数组。

我将尝试一步一步地描述正在发生的事情。解释可能会有点长,所以喝杯咖啡或茶吧

棘手的部分是递归、文件编写器的多个实例和刷新时间的组合。

writeBackwards的每次调用中,它都会实例化编写器类。之后,代码将获得";第N个字";从文本行。然后,单词被传递给编写器,,但它"未刷新">。然后,递归开始。只有n为零时,递归才会结束,然后开始刷新。

让我们用一个例子来回顾一下。在原始文本文件中;我喜欢苹果">

让我们"调试";(实际上,我鼓励您使用IDE的调试模式(:

在caller方法中,读取该行,得到的字数为3。

调用writeBackwards,使用n值3。将创建一个新的文件编写器。在方法的第一次调用中;苹果";被选中,并写入文件写入程序,但未刷新。再次调用该方法,此时n为2。

writeBackwards是第二次调用,使用n值3将创建一个新的文件写入程序在方法的第二次调用中;像";被选中,并写入新文件写入程序但未刷新。再次调用该方法,此时n为1。

writeBackwards是第三次调用,使用n值1将创建一个新的文件写入程序在方法的第三次调用中;我"被选中,并写入新文件写入程序但未刷新。再次调用该方法,现在n为0。

writeBackwards是第四次调用,使用n值0将创建一个新的文件写入程序在该方法的第四次调用中,没有剩余的单词,并写入一行新行,它将被刷新

现在稍作停顿。在刷新所有内容之前,让我们检查一下堆栈中的内容
在当前执行范围中,您有一个文件编写器,其中有一个新行字符要刷新。在前面的范围中,有一个文件编写器;我"文本,具有以下范围,每个范围具有一个具有"文本"的作者;像";以及";苹果";,分别地

现在所有的东西都将被刷新,但由于它发生在递归的末尾,它将以相反的顺序进行(具有讽刺意味的是,在这种情况下,它将保持原始顺序(。

首先,新的行char被刷新,然后是"char";我喜欢苹果;。

如何修复:

有多种方法可以实现你最初的目标。

快速修复方法是在递归发生之前移动要执行的flush语句。

outFile.print("");
outFile.print(lastToken + " ");
System.out.print(lastToken + " ");
bWrite.flush();
writeBackwards(s, n-1);

有许多其他方法可以重写代码,但这个答案太大了。您可以创建一个文件编写器并在递归中传递它,或者重写writeBackwards方法以只反转句子,将文件写入另一段代码。

再观察一次:

  • 您的代码没有正确关闭文件。尝试搜索";java尝试资源&;或关于Java中安全文件处理的文章

最新更新