如何在多个 类 (java) 中使用同一个 printwriter
how to use the same printwriter in multiple classes (java)
我正在开发一个小程序,它要求我从文件中读取一组参数,在 3 classes 中对它们执行一些 if else 操作(所有 3 classes 继承同一个父 class)。在每次操作之后,该方法应该像这样在输出文件中打印一行
方法1的输出1
方法 2 的输出 1
方法 1 的输出 2
方法 1 等的输出 3
想法是所有 3 个 classes 的所有方法都应该打印在同一个文件中,顺序并不重要。
我在每个 method/if 块的末尾都使用了这段代码
if/method {
.... do something
text ="output of something";
try(PrintWriter out = new PrintWriter("outputfile.txt") ){
out.println(text);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}//end if/method
该代码确实向文件写入了一些内容,但它总是会覆盖前一行。因此,例如,我没有 12 行 "something" 我只有 1.
我该如何解决这个问题?我怀疑这是因为我每次都创建一个新的 PrintWriter 并考虑过在其他地方声明它并调用它给每个 class。那行得通吗?我将如何为每个 class 调用它?
这是我第一次使用文件。谢谢。
尝试将 PrintWriter 声明为父 class 的静态变量,并根据需要在子 class 中使用它。
您用来创建 PrintWriter
的构造函数在内部使用了 FileOutputStream
的新实例。
FileOutputStream
有两种通用的写入模型:
- 覆盖(默认)
- 附加
由于您没有指定要使用的模式,您的编写器将使用默认模式。要告诉它您想要哪种模式,您需要使用正确的模式创建 FileOutputStream
。例如,像这样:
try(PrintWriter out = new PrintWriter(new FileOutputStream("outputfile.txt", true))) {
// note the boolean parameter in FileOS constructor above. Its "true" value means "Append"
out.println(text);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
关于每个 class 创建自己的 PrintWriter
还有一些话要说:
- 它重复了逻辑
- 它(可能不必要地)将您的 class 所做的任何操作与输出操作特别绑定到一个文件中(如果您想改为通过 http 写入怎么办?)
- 打开文件的操作通常不便宜,所以你在那里失去了性能
我建议与其每个 class 创建自己的输出设施,不如从外部接收一个:
class MyClass {
public void outputTo(PrintWriter w) {
String text = ...
w.println(text);
}
}
and you use it like this:
try (FileOutputStream fos = new FileOutputStream("filename", append);
PrintWriter w = new PrintWriter(fos)) {
new MyClass().outputTo(w); // first instance
new MyClass().outputTo(w); // second instance
//... etc.
}
我正在开发一个小程序,它要求我从文件中读取一组参数,在 3 classes 中对它们执行一些 if else 操作(所有 3 classes 继承同一个父 class)。在每次操作之后,该方法应该像这样在输出文件中打印一行
方法1的输出1 方法 2 的输出 1 方法 1 的输出 2 方法 1 等的输出 3
想法是所有 3 个 classes 的所有方法都应该打印在同一个文件中,顺序并不重要。
我在每个 method/if 块的末尾都使用了这段代码
if/method {
.... do something
text ="output of something";
try(PrintWriter out = new PrintWriter("outputfile.txt") ){
out.println(text);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}//end if/method
该代码确实向文件写入了一些内容,但它总是会覆盖前一行。因此,例如,我没有 12 行 "something" 我只有 1.
我该如何解决这个问题?我怀疑这是因为我每次都创建一个新的 PrintWriter 并考虑过在其他地方声明它并调用它给每个 class。那行得通吗?我将如何为每个 class 调用它?
这是我第一次使用文件。谢谢。
尝试将 PrintWriter 声明为父 class 的静态变量,并根据需要在子 class 中使用它。
您用来创建 PrintWriter
的构造函数在内部使用了 FileOutputStream
的新实例。
FileOutputStream
有两种通用的写入模型:
- 覆盖(默认)
- 附加
由于您没有指定要使用的模式,您的编写器将使用默认模式。要告诉它您想要哪种模式,您需要使用正确的模式创建 FileOutputStream
。例如,像这样:
try(PrintWriter out = new PrintWriter(new FileOutputStream("outputfile.txt", true))) {
// note the boolean parameter in FileOS constructor above. Its "true" value means "Append"
out.println(text);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
关于每个 class 创建自己的 PrintWriter
还有一些话要说:
- 它重复了逻辑
- 它(可能不必要地)将您的 class 所做的任何操作与输出操作特别绑定到一个文件中(如果您想改为通过 http 写入怎么办?)
- 打开文件的操作通常不便宜,所以你在那里失去了性能
我建议与其每个 class 创建自己的输出设施,不如从外部接收一个:
class MyClass {
public void outputTo(PrintWriter w) {
String text = ...
w.println(text);
}
}
and you use it like this:
try (FileOutputStream fos = new FileOutputStream("filename", append);
PrintWriter w = new PrintWriter(fos)) {
new MyClass().outputTo(w); // first instance
new MyClass().outputTo(w); // second instance
//... etc.
}