我想将结果输出到文件中。我使用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函数的输出出现在输出文件中。请问如何解决?
答案 0 :(得分:2)
您的代码中有三个(OK ...使这四个,没有五个)重大问题。
在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样式指南,阅读它并相应地格式化代码。
始终编写代码,以便>>其他人<<可以阅读。
答案 1 :(得分:0)
这是因为你永远不会关闭main()中的任何东西。你也在吞咽异常,所以你隐瞒自己的真相。不要那样做。
但这种做法很糟糕。您应该保持文件打开并使用相同的FileWriter,BufferedWriter,PrintWriter,并同步对它们的访问,这样您就不会获得交错数据。
总体来说不是一个好主意。
答案 2 :(得分:0)
我认为您需要调用new class1().print()
或new class2().print()
,即您需要先实例化实例。
另请注意在每个print()函数中关闭文件。