Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何预先设置即时刷新的流_Java_Unit Testing_Netbeans_Stream_System.out - Fatal编程技术网

Java 如何预先设置即时刷新的流

Java 如何预先设置即时刷新的流,java,unit-testing,netbeans,stream,system.out,Java,Unit Testing,Netbeans,Stream,System.out,我正在用netbeanside编写一个单元测试包。现在,我正在将执行语句流打印到System.out,而将错误语句打印到System.error。现在,由于它们是两个不同的流,所以它们的打印顺序不正确。我的意思是他们没有同步打印。我知道flush方法会使语句立即打印出来,但在每次这样的语句之后再写这些语句是很乏味的。如何预先配置流以立即刷新。可能在单元测试开始时 我想要这个,因为我想利用Netbeans为两个输出流显示的两种不同颜色 此外,我的方法中的任何错误点和改进建议都是非常受欢迎的。您可以

我正在用
netbeanside
编写一个单元测试包。现在,我正在将执行语句流打印到
System.out
,而将错误语句打印到
System.error
。现在,由于它们是两个不同的流,所以它们的打印顺序不正确。我的意思是他们没有同步打印。我知道
flush
方法会使语句立即打印出来,但在每次这样的语句之后再写这些语句是很乏味的。如何预先配置流以立即刷新。可能在单元测试开始时

我想要这个,因为我想利用
Netbeans
为两个输出流显示的两种不同颜色


此外,我的方法中的任何错误点和改进建议都是非常受欢迎的。

您可以用另一种方法包装
println()
flush()

void out(String s) {
  System.out.println(s);
  System.out.flush();
}

无论如何,看看我编写测试的方式:只有信息消息。错误消息由失败的断言隐式写入。

您可以用另一种方法包装
println()
flush()

void out(String s) {
  System.out.println(s);
  System.out.flush();
}

无论如何,看看我编写测试的方式:只有信息消息。错误消息是由失败的断言隐式写入的。

可能还有另一种可能性,请尝试一下:

import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;

public class SystemOut {
    public static void main(String[] args) {
        System.out.println("Hi");

        final OutputStream newOs = new OutputStream() {
            FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);

            @Override
            public void write(int b) throws IOException {
                this.fdOut.write(b);
            }
        };

        System.setOut(new PrintStream(newOs));
        System.out.println("Hi, again");
    }
}

我们的想法是将现有的缓冲输出流替换为非缓冲输出流。

可能还有另一种可能性,因此请尝试一下:

import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;

public class SystemOut {
    public static void main(String[] args) {
        System.out.println("Hi");

        final OutputStream newOs = new OutputStream() {
            FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);

            @Override
            public void write(int b) throws IOException {
                this.fdOut.write(b);
            }
        };

        System.setOut(new PrintStream(newOs));
        System.out.println("Hi, again");
    }
}

其想法是将现有的缓冲输出流替换为非缓冲输出流。

您不应该自己打印执行流。不这样做的原因有很多:

  • 您不应该打印成功测试的状态。有一个非常重要的问题 这样做的理由有限。你到底想要什么 你的测试是为了发现bug,而不是做得好的案例。专注于你的工作 问题
  • 所有用于单元测试的现代框架,如jUnit或TestNG, 为测试结果输出提供内置机制。花钱 花些时间来学习它们,你的测试将提供更多的信息
  • 冗余日志记录会降低测试的速度,这一点很关键,因为它们 应该经常发射
  • 如果你使用练习,你只会对其中一个感兴趣 立即发送失败消息。这是一个很好的方法,可以让你集中精力 更有效

简而言之,您不会阅读成功日志,因为它们是无用的。对于失败的测试,您有标准的消息断言。

您不应该自己打印执行流程。不这样做的原因有很多:

  • 您不应该打印成功测试的状态。有一个非常重要的问题 这样做的理由有限。你到底想要什么 你的测试是为了发现bug,而不是做得好的案例。专注于你的工作 问题
  • 所有用于单元测试的现代框架,如jUnit或TestNG, 为测试结果输出提供内置机制。花钱 花些时间来学习它们,你的测试将提供更多的信息
  • 冗余日志记录会降低测试的速度,这一点很关键,因为它们 应该经常发射
  • 如果你使用练习,你只会对其中一个感兴趣 立即发送失败消息。这是一个很好的方法,可以让你集中精力 更有效

简而言之,您不会阅读成功日志,因为它们是无用的。对于失败的测试,您有标准的消息传递断言。

+1表示这种想法….但java api中有没有办法不让我做这种事情。+1表示这种想法….但java api中有没有办法不让我做这种事情。这样更好…所以流没有这样配置的方法?您可以通过编辑将这两个答案组合在一起……我不知道Java中有什么方法可以在现有的
BufferedWriter构建后减少其缓冲区大小。每条消息都将立即发送到磁盘。这将比通常的日志记录对测试性能的影响更大。@Maksim我同意。我提供的两个答案都代表了技术解决方案。至于设计/编写测试,我已经在我的另一个答案中添加了一条注释。这更好…所以没有方法将流配置为这样?您可以通过编辑将这两个答案组合在一起……我不知道Java中有什么方法可以在现有的
BufferedWriter构建后减少其缓冲区大小。每条消息都将立即发送到磁盘。这将比通常的日志记录对测试性能的影响更大。@Maksim我同意。我提供的两个答案都代表了技术解决方案。至于设计/写作测试,我已经在另一个答案中添加了一条评论。为什么否决我的问题?为什么否决我的问题?