Java 可疑IO行为:System.out未刷新

Java 可疑IO行为:System.out未刷新,java,io,Java,Io,我正在做一个GA,它一直工作到上周都很好。在我努力优化代码的过程中,我不知何故打破了程序输出序列,在该序列中,程序会转储关于每一代个体的信息。在我所有的调试工作中,我逐渐了解到这可能是一个冲洗问题,但我不能真正指出问题的症结所在奇怪的是,自从代码的上一个工作版本以来,我实际上没有接触IO的任何部分。 GA是一个更大的软件的一部分,其中有一个进度控制台,它本质上是一种将System.out和System.err镜像到GUI的方法。通过调试,我意识到即使我专门调用ps.flush(),缓冲区也不会刷

我正在做一个GA,它一直工作到上周都很好。在我努力优化代码的过程中,我不知何故打破了程序输出序列,在该序列中,程序会转储关于每一代个体的信息。在我所有的调试工作中,我逐渐了解到这可能是一个冲洗问题,但我不能真正指出问题的症结所在奇怪的是,自从代码的上一个工作版本以来,我实际上没有接触IO的任何部分。

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

这个问题的原因是什么


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

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

  • 如果我添加一个通知行,比如
    System.out.println(“健身计算完成了!”)
    在我的
    evaluateGeneration()
    方法中,该方法在
    outputGenInfo()
    之前调用,每次生成的信息都会按预期的方式打印出来。。。[这一行是我在优化过程中删减的内容之一]

  • 对于镜像/重定向
    System.out
    我使用了Rob Camick编写的
    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不用担心,我只是想知道你是不是在暗示什么……收回你的更改,让应用程序重新工作。当应用程序工作时,通过输出序列跟踪执行情况。一旦您理解了输出序列,请小心地将更改放回,一次一个更改,以避免破坏输出序列。