2017-08-09 55 views
1

我正在研究一个小程序,它需要我从一个文件中读取一组参数,对其中的三个类执行一些操作(所有3个类继承相同的父类)。每个操作之后,该方法应该打印一行在一个输出文件中类似方法2 方法的方法1个 输出3 1等如何在多个类中使用相同的printwriter(java)

的的输出2的方法1个 输出1的该

输出1想法是所有3个类的所有方法都应该在同一个文件中打印,顺序不重要。

我已经使用这个代码在每个方法的末尾/ 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行“东西”,我只有1个。

我该如何解决这个问题?我怀疑这是因为我每次都制作一个新的PrintWriter,并想过在其他地方声明它并将其调用给每个类。这会起作用吗?我怎么去把它叫给每个班?

这是我第一次使用文件。谢谢。

+0

是的,问题是你创造的所有三个类的新PrintWriter。而不是做这个,你必须把它作为参数传递。例如:编写处理方法以接受PrintWriter作为参数,然后在主方法中创建一个PrintWriter实例,然后将三个方法调用放入其try块中。 –

+0

@BalázsNemes,如果写操作不是并发和及时分离的(即每个类可以写而不管其他三个类正在做什么),为每个类创建自己的打印作家实际上是很好的。 –

+0

@ M.Prokhorov好的..那么我该如何避免覆盖? –

回答

1

您用于创建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(); 
} 

有什么可说的对每一类创建自己的PrintWriter还有:

  • 它复制的逻辑
  • 它(可能是不必要的)关系无论你类与输出操作专门到一个文件(如果你想写在HTTP上呢?)
  • 打开文件的操作通常不便宜,所以你失去了性能

我建议,而不是每个类创建自己的输出设备,而不是它应该接受一个来自外部:

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. 
} 
+0

非常感谢。这真的有帮助! :) –

0

尝试声明PrintWriter作为父类的静态变量,并根据需要在子类中使用它。

+0

那么,public static PrintWriter出来了吗? –

+1

@DanielBoksan,这实际上是一个非常糟糕的主意,因为没有哪个类会知道什么时候关闭作者,并且你会拥有一个很好的小资源泄漏。 –

相关问题