请注意:我不是“寻找代码” - 只是解决这个问题的算法的想法。
这是一项家庭作业。我以为我在家里,即将完成它,但最后一部分绝对难倒我。从来没有像这样被困住。它与Java中的线程有关。
Driver类读取文件,第一行表示线程数,第二行是每个要读取的线程的空格分隔文件名列表。每个线程编号(0 - N),N是文件总数。每个线程读取指定的文件,并输出到名为t#_out.txt的文件,其中#是线程索引。
完成所有这些后,驱动程序线程必须:
在所有线程完成执行后,程序Driver.java将打开所有线程 输出文件t#_out.txt,从每个文件中读取一行,然后写入 输出到输出文件out.txt。
out.txt示例:
MyThread [0]:Line [1]:有一些不爱墙的东西,
MyThread [1]:Line [1]:世界的HOG Butcher,
MyThread [2]:Line [1]:我想我永远不会见到
MyThread [0]:Line [2]:在它下面发送冻土膨胀,
MyThread [1]:Line [2]:Tool Maker,Wheat Stacker,
MyThread [2]:Line [2]:一首可爱的诗
MyThread [0]:Line [3]:在阳光下溢出上部巨石,
MyThread [1]:Line [3]:铁路玩家和国家货运处理员;
MyThread [2]:Line [3]:饥肠辘辘的树
我的问题是:我可以设置什么样的循环结构来执行此操作?从t1_out.txt读取一行,写入out.txt,从t2_out.txt读取行,写入out.txt,从tN_out.txt读取行,写入out.txt?我如何知道一个文件何时到达?
思路:
使用while(!done)循环继续循环,直到每个扫描程序完成。跟踪一系列布尔值,指示扫描仪是否已完成读取其文件。扫描仪也会在阵列中。这个问题是如何判断ALL何时完成,完成无限循环?在每次迭代中,看看booleans [i]是否完成,如果没有,则完成= false?不好。
只需将每个文件行读入自己的String []数组。然后找出一个循环来交替写入out.txt。问题是当我点击数组索引超出范围时会发生什么?这也不是规格,它说要读一行,然后写一行。
编辑:解决方案是创建一个allFilesReachedEOF()方法,其初始布尔值为true。然后循环遍历每个,如果ANY有另一行要读取,则将返回条件设置为false。这是我的while循环条件:while(!allFilesReachedEOF())。
我的问题是我试图从循环中控制循环。因此,如果一个文件有另一行,它将继续,但如果任何文件EOF,循环将停止。
感谢您的帮助!
答案 0 :(得分:2)
你可以做一段时间,条件是并非所有文件都达到了EOF。然后迭代遍历所有文件,对于那些尚未达到EOF的文件,读取下一行并将其写入输出文件。当你去的时候,你为“while”循环更新你的条件变量。
这是你想要做的吗?
答案 1 :(得分:1)
听起来你可以使用Queue来实现这一目标。将每个t#_out.txt的输入添加到Queue
,然后实现一个循环,在该循环中,您从轮询输入中读取一行并将其写入输出。只要读取的行不是EOF,请将输入重新添加到Queue
。当Queue
为空时,从循环中断开。
另外,我建议输出BufferedWriter,最后flush()
,以便实际写入只发生一次。
答案 2 :(得分:0)
以下是要点:
run()
方法执行您需要一个线程执行的操作。它可能需要threadNumber
和filename
的字段。 run方法应确保close()输出文件的输出流答案 3 :(得分:0)
这可以通过使用do - while“退出条件”循环和内部for循环来迭代输出文件来完成。在for循环开始之前将退出条件设置为true,如果从任何文件获得至少一行,则在for循环内重置它。
已经达到eof的文件将继续被读取,但不会返回任何行。您可以选择为这些行打印空行或只是跳过它们。