我想将结果输出到文件中。我使用 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 函数的输出。请问如何解决?
最佳答案
您的代码存在三个(好吧……就四个,不是五个)重大问题。
在
class2
你不close
或冲洗the
完成写入后的 PrintWriter`。这意味着数据永远不会被写出到文件中。这就是为什么你永远看不到输出。这是一个明显的错误。但其余的问题也很重要。可以说更重要......所以请继续阅读。
print()
class2
中的方法泄漏文件描述符(!)。每次调用它时,它都会打开一个文件描述符,写入内容......然后将其放在地板上。如果您调用print()
反复,FileWriter
构造函数将失败。您需要关闭文件,确保它总是发生的最干净的方法是编写如下代码:try (PrintWriter printWriter = new PrintWriter(new BufferedWriter( new FileWriter("myfile.txt", true)))) { printWriter.println(...); }
这是一个“尝试资源”......并且它保证当范围退出时资源(
printWriter
)将被关闭。您正在消除异常。
try { PrintWriter printWriter - ... } catch (IOException e) { // SQUASH!!! }
这真的非常糟糕。基本上,您编写的代码是为了忽略异常。假装它从未发生过……并丢弃异常中说明为什么它发生的信息。
如果您绝对确定您只会捕获预期的异常,并且忽略它们是绝对正确的,那么您应该只压缩异常。在这里,不是。如果
IOException
被抛出这里,你需要知道为什么!打开多个流写入同一个文件会导致问题。流不会同步,您可能会看到输出以意外方式在输出文件中交错。如果输出管道包含缓冲(就像您的那样),问题会更糟。
您有严重的 Java 风格问题:
类名应始终以大写字母开头。总是。即使在示例代码片段中...
代码应一致缩进。我建议使用 SP 字符而不是 TAB 字符,因为制表符的显示不一致。
有关于应该和不应该在哪里放置空格和换行符的样式规则。例如,二元运算符周围应该始终有空格。查找 Java 样式指南,阅读它并相应地格式化您的代码。
始终编写您的代码,以便>>其他人<<可以阅读它。
关于java - 使用 BufferWriter 从多个类写入同一文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32533827/