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)
来做到这一点,其中 file
是 std::ofstream
.
我的问题是 Java 中似乎没有任何统一的执行方式 I/O。我需要将完全相同的一组数据打印到控制台和文件。我能做到的最简洁的方法是什么?如果我可以像以前使用 std::ostream
和 std::ofstream
那样多态地做到这一点,那将是我的偏好,因为我已经习惯了。
System.out
是 PrintStream
,写入文件是通过 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
在你的情况下 StringBuffer class in java 将达到目的。它的主要操作是追加和插入方法,它们被重载以接受任何类型的数据。
想了解更多可以参考StringBuffer_reference
在 C++ 中,我过去常常通过传递 std::ostream
个对象来节省自己很多时间。例如,我不会将所有数据记录硬编码到 std::cout
,而是像这样将 std::cout
作为函数的默认参数。
void func(std::ostream os = std::cout) {
...
os<<"Something";
...
}
那样的话,如果我想稍后将相同的数据打印到一个文件中,我可以通过调用 func(file)
来做到这一点,其中 file
是 std::ofstream
.
我的问题是 Java 中似乎没有任何统一的执行方式 I/O。我需要将完全相同的一组数据打印到控制台和文件。我能做到的最简洁的方法是什么?如果我可以像以前使用 std::ostream
和 std::ofstream
那样多态地做到这一点,那将是我的偏好,因为我已经习惯了。
System.out
是 PrintStream
,写入文件是通过 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
在你的情况下 StringBuffer class in java 将达到目的。它的主要操作是追加和插入方法,它们被重载以接受任何类型的数据。 想了解更多可以参考StringBuffer_reference