可疑的IO行为:System.out不会刷新

时间:2012-10-02 13:25:06

标签: java io

我正在研究一个过去常常工作到上周的GA。在我优化代码的努力中,我以某种方式打破了程序转储有关每一代人的信息的输出顺序。在我所有的调试工作中,我开始明白它可能是一个令人烦恼的问题,但我无法真正指出问题。 奇怪的是,自从上一个工作版本的代码以来,我实际上没有触及IO的任何部分。

GA是一个更大的软件的一部分,其中有一个进度控制台,它本质上是一种“镜像”System.outSystem.err到GUI的方法。根据我的调试工作,我意识到即使我专门拨打ps.flush(),缓冲区也不会刷新。

这个问题可能是什么原因?


修改:回答评论中的问题以及有关问题的更多信息:

  • 软件的其余部分正常输出到GUI和Eclipse控制台,只有对outputGenInfo()方法(见下文)的调用已经消失

  • 如果我在System.out.println("Fitness calculation is complete!");方法中添加evaluateGeneration()之类的通知行,该方法在outputGenInfo()之前调用,则每个代的信息都会按预期完全打印出来。 。[那条特殊的线条是我在优化过程中修剪过的东西之一]

  • 对于镜像/重定向System.out我使用了Rob Camick编写的MessageConsole类,可以找到here


可疑代码如下:

/**
 * 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("");  

}

0 个答案:

没有答案