Java 中的 C++ 样式多态输出

C++ style polymorphic output in Java

在 C++ 中,我过去常常通过传递 std::ostream 个对象来节省自己很多时间。例如,我不会将所有数据记录硬编码到 std::cout,而是像这样将 std::cout 作为函数的默认参数。

void func(std::ostream os = std::cout) {
    ...
    os<<"Something";
    ...
 }

那样的话,如果我想稍后将相同的数据打印到一个文件中,我可以通过调用 func(file) 来做到这一点,其中 filestd::ofstream.

我的问题是 Java 中似乎没有任何统一的执行方式 I/O。我需要将完全相同的一组数据打印到控制台和文件。我能做到的最简洁的方法是什么?如果我可以像以前使用 std::ostreamstd::ofstream 那样多态地做到这一点,那将是我的偏好,因为我已经习惯了。

System.outPrintStream,写入文件是通过 java 中的 FileOutputStream 执行的。常见的super-class是OutputStream。由于 OutputStream 只会写 byte[]byte 和其他一些原语,因此您必须使用 wrapper-class。

class OutputWrapper{
    private OutputStream os;

    public OutputWrapper(OutputStream os){
        this.os = os;
    }

    public void print(String s){
        os.write(s.getBytes());
    }

    public void flush(){
        os.flush();
    }

    ...
}

void someMethod(OutputStream os){
    OutputWrapper out = new OutputWrapper(os);
    out.print("Hello, World!");
    out.flush();
}

someMethod(System.out);//print to console
someMethod(new FileOutputStream("somefile.txt"));//print to file

我在这里省略了 error-handling,该示例非常基础,但这是您最接近上述行为的示例。

因为 PrintStream 可以将文件名作为构造函数参数,我会这样简化 Paul 的回答:

void someMethod(PrintStream ps) {
    ps.print(...);
    ps.format(....);
    // etc
}

someMethod(System.out);                           // Output to console
someMethod(new PrintStream("file.out", "UTF-8")); // Output to a file

Documentation here

在你的情况下 StringBuffer class in java 将达到目的。它的主要操作是追加和插入方法,它们被重载以接受任何类型的数据。 想了解更多可以参考StringBuffer_reference