对于我的计算基础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中安全文件处理的文章