使用来自多个类的BufferWriter写入同一文件

时间:2015-09-12 00:12:17

标签: java filewriter

我想将结果输出到文件中。我使用BufferWriter如下:

public class class1{
...
void print()
     {
     System.out.println("The name "+outName()+" Tel: "+outNumber());
       try{
          PrintWriter printWriter=new PrintWriter(new BufferedWriter(new FileWriter("myfile.txt", true)));
          printWriter.println("The name "+outName()+" Tel: "+outNumber());
        }catch (IOException e){}
       }

    }     

但是我有另一个类和main函数也有自己的打印函数

public class class2{
    ...
    void print()
         {
         System.out.println("The name "+outName()+" Tel: "+outNumber());
           try{
              PrintWriter printWriter=new PrintWriter(new BufferedWriter(new FileWriter("myfile.txt", true)));
              printWriter.println("The name "+outName()+" Tel: "+outNumber());
            }catch (IOException e){}
           }

        }  

public static void main(String[] args) throws IOException{

try{
    PrintWriter printWriter=new PrintWriter(new BufferedWriter(new FileWriter("myfile.txt", true)));
    ...
    printWriter.println("something");

printWriter.close();
    }catch(IOException e){ }

}

代码传递编译,但只有main函数的输出出现在输出文件中。请问如何解决?

3 个答案:

答案 0 :(得分:2)

您的代码中有三个(OK ...使这四个,没有五个)重大问题。

  1. class2完成撰写后,您不会close或刷新the PrintWriter`。这意味着数据永远不会写入文件。这就是你永远看不到输出的原因。

    这是一个明显的错误。但其余的问题也很重要。可以说更重要 ......所以继续阅读。

  2. print()中的class2方法泄漏了文件描述符(!)。每次调用它时,它都会打开一个文件描述符,写下东西......并将其放在地板上。如果反复调用print()FileWriter构造函数将失败。您需要来关闭文件,确保它始终发生的最简洁方法是编写如下代码:

    try (PrintWriter printWriter = 
             new PrintWriter(new BufferedWriter(
                 new FileWriter("myfile.txt", true)))) {
        printWriter.println(...);
    }
    

    这是"尝试使用资源" ... 保证在范围退出时资源(printWriter)将被关闭。

  3. 你正在挤压异常。

    try {
        PrintWriter printWriter - ...
    } catch (IOException e) {
        // SQUASH!!!
    }
    

    这真的非常糟糕。基本上,您已将代码写入忽略异常。假装它从未发生过......并抛弃了为什么发生的异常中的信息。

    如果您完全确定只会捕获预期的异常,那么您应该只压缩异常,并且忽略它们是完全正确的。在这里,它不是。如果在此处抛出IOException,则需要知道原因!

  4. 打开多个流来写入同一个文件是一个问题的处方。流不会被同步,您可能会以意外方式看到输出文件中的输出交错。如果输出管道包括缓冲(就像你的那样),问题就更糟了。

  5. 您有严重的Java样式问题:

    • 类名应始终以大写字母开头。总是。即使在示例代码段中......

    • 代码应始终缩进。我建议使用SP字符而不是TAB字符,因为标签不能一致显示。

    • 有关于应该在哪里的样式规则,不应该放置空格和换行符。例如,二元运算符周围应该总是有空格。查找Java样式指南,阅读它并相应地格式化代码。

    始终编写代码,以便>>其他人<<可以阅读。

答案 1 :(得分:0)

这是因为你永远不会关闭main()中的任何东西。你也在吞咽异常,所以你隐瞒自己的真相。不要那样做。

但这种做法很糟糕。您应该保持文件打开并使用相同的FileWriter,BufferedWriter,PrintWriter,并同步对它们的访问,这样您就不会获得交错数据。

总体来说不是一个好主意。

答案 2 :(得分:0)

我认为您需要调用new class1().print()new class2().print(),即您需要先实例化实例。

另请注意在每个print()函数中关闭文件。