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

Write to the same file using BufferWriter from multiple classes

我想将我的结果输出到一个文件中。我使用 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){}
       }

    }     

但是我还有另一个 class 和 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函数的输出。请问如何解决?

这是因为您永远不会关闭 main() 中除外的任何内容。你也在吞下例外,所以你在向自己隐瞒真相。不要那样做。

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

总的来说这不是个好主意。

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

另外请记得在每个 print() 函数中关闭文件。

您的代码存在三个(好吧...算四个,没有五个)重大问题。

  1. class2 中,您不会在完成写入后 close 或刷新 thePrintWriter。这意味着数据永远不会写到文件中。这就是为什么您永远看不到输出的原因。

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

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

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

    这是一个 "try with resource" ...并且它保证资源(printWriter)将在作用域退出时关闭。

  3. 您正在压缩异常。

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

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

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

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

  5. 你有严重的 Java 风格问题:

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

    • 代码缩进应该一致。我建议使用 SP 字符而不是 TAB 字符,因为制表符显示不一致。

    • 关于应该和不应该放置空格和换行符的位置有一些样式规则。例如,二元运算符周围应该始终有空格。查找 Java 风格指南,阅读它并相应地格式化您的代码。

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