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