Java 可疑IO行为:System.out未刷新
我正在做一个GA,它一直工作到上周都很好。在我努力优化代码的过程中,我不知何故打破了程序输出序列,在该序列中,程序会转储关于每一代个体的信息。在我所有的调试工作中,我逐渐了解到这可能是一个冲洗问题,但我不能真正指出问题的症结所在奇怪的是,自从代码的上一个工作版本以来,我实际上没有接触IO的任何部分。 GA是一个更大的软件的一部分,其中有一个进度控制台,它本质上是一种将Java 可疑IO行为:System.out未刷新,java,io,Java,Io,我正在做一个GA,它一直工作到上周都很好。在我努力优化代码的过程中,我不知何故打破了程序输出序列,在该序列中,程序会转储关于每一代个体的信息。在我所有的调试工作中,我逐渐了解到这可能是一个冲洗问题,但我不能真正指出问题的症结所在奇怪的是,自从代码的上一个工作版本以来,我实际上没有接触IO的任何部分。 GA是一个更大的软件的一部分,其中有一个进度控制台,它本质上是一种将System.out和System.err镜像到GUI的方法。通过调试,我意识到即使我专门调用ps.flush(),缓冲区也不会刷
System.out
和System.err
镜像到GUI的方法。通过调试,我意识到即使我专门调用ps.flush()
,缓冲区也不会刷新
这个问题的原因是什么
编辑:回答评论中的问题以及有关问题的更多信息:
- 软件的其余部分正常地将其输出到GUI和Eclipse控制台,只有对
方法(见下文)的调用消失了outputGenInfo()
- 如果我添加一个通知行,比如
在我的System.out.println(“健身计算完成了!”)
方法中,该方法在evaluateGeneration()
之前调用,每次生成的信息都会按预期的方式打印出来。。。[这一行是我在优化过程中删减的内容之一]outputGenInfo()
- 对于镜像/重定向
我使用了Rob Camick编写的System.out
类,可以找到MessageConsole
可疑代码如下:
/**
* Convenience method for getting debug/info
* on this generation
* @param ps - a <code>PrintStream</code> to output to
* */
public void outputGenInfo(PrintStream ps){ // <-- ps = System.out by default
double stdev_fitness = stats.getStandardDeviation();
double mean_fitness = stats.getMean();
double cv = stdev_fitness / mean_fitness;
StringBuilder sb = new StringBuilder();
String new_line = System.getProperty("line.separator");
sb.append(new_line);
sb.append("+++++++++++++++++++++++++++++++++");
sb.append(new_line);
sb.append("Generation: " + this.id);
sb.append(new_line);
sb.append("-------------------------------");
sb.append(new_line);
sb.append("Mean fitness: " +
String.format("%.3f",mean_fitness) +
", CV: " + String.format("%.3f",cv));
sb.append(new_line);
sb.append("Top fitness: " + getTopIndividual().getEntropy());
sb.append(new_line);
sb.append("+++++++++++++++++++++++++++++++++");
sb.append(new_line);
ps.println(sb.toString());
// during debug this actually helps but not when the code is running full throttle!
System.out.println("");
}
我的意思是,当我的缓冲区没有刷新时,无论是在Java还是.Net中,我都会开始胡思乱想,很抱歉我的离题评论。您想要的是将控制台输出重定向到GUI吗?您的应用程序使用的是什么日志库?它是在应用服务器上运行吗?@lordcolve不用担心,我只是想知道你是不是在暗示什么……收回你的更改,让应用程序重新工作。当应用程序工作时,通过输出序列跟踪执行情况。一旦您理解了输出序列,请小心地将更改放回,一次一个更改,以避免破坏输出序列。