我想重写并简单地使用我的代码来减少类中完全相同但写入文件或控制台的方法数量,以便我可以执行以下操作:
PrintFlightSchedule(String aFileName); // prints to a file
PrintFlightSchedule(); // writes to console.
我尝试创建以下测试方法只是为了演示我想要实现的目标,方法是定义一个抽象的OutputStream,然后将其实例化为PrintStream或console(通过System.out):
public static void testOutputStream(String fileNm, String msg) {
OutputStream os;
if (fileNm.equals("") ) { // No file name provided, write to console
os = System.out;
}
// File name provided, write to this file name
else {
try {
os = new FileOutputStream(fileNm);
}
catch (FileNotFoundException fe) {
System.out.println("File not found " + fe.toString());
}
}
// Use the output stream here - ideally println method?
// os.println or write(6);
}
这是公认的一半,但它让你知道我想要实现的目标。
在Java中是否有一种方法可以在运行时定义输出方法(文件或控制台),因此我可以在运行时使用相同的方法来执行任何操作?我想一个简单的方法是将FileOutputStream重定向到控制台 - 这可能吗?
答案 0 :(得分:4)
基本上,您需要创建一个只需要OutputStream
并将所有细节写入其中的方法......
然后你创建了一些辅助方法,只需用适当的流来调用它......
public void printFlightSchedule(OutputStream os) throws IOException {
// Write...
}
public void printFlightSchedule(File file) throws IOException {
FileOutputStream fis = null;
try {
fis = new FileOutputStream(file);
printFlightSchedule(fis);
} finally {
try {
} catch (Exception e) {
}
}
}
public void printFlightSchedule() throws IOException {
printFlightSchedule(System.out);
}
您可能还想查看Code Conventions for the Java Language ...这样可以让人们更轻松地阅读和理解您的代码;)
答案 1 :(得分:1)
不要提供文件名String作为参数,而是提供Writer。 您方法的签名变为
void PrintFlightSchedule(Writer writer);
您显示的代码将是在启动时根据运行时参数创建Writer的位:
public static Writer createOutputWriter(String fileNm) {
OutputStream os;
if (fileNm.equals("") ) { // No file name provided, write to console
os = System.out;
}
// File name provided, write to this file name
else {
try {
os = new FileOutputStream(fileNm);
}
catch (FileNotFoundException fe) {
System.out.println("File not found " + fe.toString());
}
}
return new BufferedWriter(new OutputStreamWriter(os));
}
输出后不要忘记刷新写入器。 How to write to Standard Output using BufferedWriter
答案 2 :(得分:1)
java.io.OutputStream
已经是'你可以写字节的东西'的抽象。如果你的类与一个OutputStream交互,你的类的客户端可以选择OutputStream实际上是什么(一个文件,一个控制台,一个空设备,......)那么你的类就不需要关心OutpuStream的类型了实际上对于给定的上下文需要。
因此,不是你的类试图做它需要做的事情和为它的客户创建OutputStreams,让它只关注它的真正责任,让客户提供他们想要的OutputStream。
所以只保留一个构造函数:
/**
* Constructs a new instance that will print to the given OutputStream
*/
PrintFlightSchedule(OutputStream stream);
答案 3 :(得分:1)
您可以使用FileDescriptor而不是字符串创建FileOutputStream。
public FileOutputStream(FileDescriptor fdObj)
创建一个文件输出流以写入指定的文件描述符,该文件描述符表示与文件系统中实际文件的现有连接。
首先,如果有安全管理器,则调用其checkWrite方法,并将文件描述符fdObj参数作为其参数。
如果fdObj为null,则抛出NullPointerException。
如果fdObj无效,则此构造函数不会抛出异常。但是,如果在结果流上调用方法以在流上尝试I / O,则抛出IOException。
默认的FileDescriptors是:
static FileDescriptor err
A handle to the standard error stream.
static FileDescriptor in
A handle to the standard input stream.
static FileDescriptor out
A handle to the standard output stream.
所以相应的应该是:
public static void testOutputStream(String fileNm, String msg) {
FileOutputStream os;
if (fileNm.equals("") ) { // No file name provided, write to console
os = new FileOutputStream(FileDescriptor.out);
}
// File name provided, write to this file name
else {
try {
os = new FileOutputStream(fileNm);
}
catch (FileNotFoundException fe) {
System.out.println("File not found " + fe.toString());
}
}
// Use the output stream here - ideally println method?
// os.println or write(6);
}