2016-01-22 109 views
0

在C++中,我通过传递std::ostream对象来节省大量时间。例如,我不会将所有数据记录硬编码为std::cout,而是使std::cout成为像这样的函数的默认参数。Java中的C++风格多态输出

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

这样,如果我想同样的数据后打印到文件,我可以通过调用func(file)其中file是一个std::ofstream做到这一点没有问题。

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

+0

所以在Java中你有良好的日志框架。如果你的目的是记录,为什么要创造你自己的车轮。使用例如slf4j登录你的东西,并做一个日志配置,这给你更多的灵活性。 – Alex

回答

2

因为PrintStream可以采取一个文件名作为构造函数的参数,我将简化保罗的回答是这样的:

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

+0

这正是我所期待的。它很简洁,它反映了我习以为常的机制。 – anthropomorphic

0

System.outPrintStream,写入文件是通过在java中执行FileOutputStream。普通的超级班级是OutputStream。由于OutputStream只会写byte[],byte和一些其他原语,不过你必须使用包装类。

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 

我在这里省略了错误处理,这个例子是非常基本的,但这是最接近上述行为的。

0

在你的情况的StringBuffer类java会达到目的。它的主要操作是append和insert方法,它们被重载以接受任何类型的数据。 要知道更多你可以参考StringBuffer_reference