java - 使用 BufferWriter 从多个类写入同一文件

标签 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){}
       }

    }     

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

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 函数的输出。请问如何解决?

最佳答案

您的代码存在三个(好吧……就四个,不是五个)重大问题。

  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 样式指南,阅读它并相应地格式化您的代码。

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

关于java - 使用 BufferWriter 从多个类写入同一文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32533827/

相关文章:

java - 输出文件新行不从下一行开始

java - 如何将外部 .txt 文件中的文本与字符串进行比较

java - 如何从命令行编译并执行Java项目?

java - FTP 客户端不断被服务器拒绝上传权限

java - 我将如何为可以处理动态字段的 Gson 对象建模?

Java 使用准备好的语句调用用户定义表函数 DB2

java - LibGDX TextButton - 只要按住它,任何事件都会被重复调用吗?

java - 我的写入方法无法在循环菜单中调用