【问题标题】:Blank file after writing to it?写入后的空白文件?
【发布时间】:2012-11-29 15:02:41
【问题描述】:

所以我一直在尝试为我的朋友编写一个 Bukkit 插件,但由于某种原因,配置生成无法正常工作。有问题的代码如下,我很乐意添加人们需要帮助我解决这个问题的任何代码。当我运行程序时,创建的配置文件最终是空白的。测试文件很好(我通过简单地注释掉删除文件的行来测试它)但是一旦我尝试获取多行它就会失败。有人可以帮忙吗?

PrintWriter out = new PrintWriter(new FileWriter(config));
out.println("########################################");
out.println("#  hPlugin is written by newbiedoodle  #");
out.println("########################################");
out.println("#   -----  Plugin config file  -----   #");
out.println("########################################");
out.println("NOTE: Do not edit the config file besides changing the values - it may result in errors.");
out.println("--------------");
out.println("Strikes before being banned?");
out.println("3");
out.println("Godmode?");
out.println("true");
out.println("First time running the plugin?");
out.println("true");
out.println("Curse protection?");
out.println("true");
out.println("Emergency shelter?");
out.println("true");
out.println("Path building?");
out.println("true");
out.println("Blocked words/phrases (Separate with comma)");
out.println("[censored]");
out.close();
System.out.println("Successfully wrote defaults to config");

整个事情都包含在一个 try/catch 循环中,只是为了捕捉可能弹出的任何错误。我感觉我遗漏了一些非常明显的东西,但我找不到它是什么。

  • config 是一个 File 对象,具有它需要的路径,所以我认为不是这样

  • 我让程序单独执行几乎所有操作,这样我就可以准确地告诉用户发生错误的位置,因此文件是在 try/catch 之外创建的。

    李>

【问题讨论】:

  • 执行flushclose 应该可以正常工作。
  • 尝试在 out.close() 之前添加一个 out.flush() 调用。我不记得PrintWriter的close方法是否为你调用了flush。
  • 本例中的变量“config”是什么?你是否设置正确如 String config = "c:\\config.txt"
  • 变量“config”是一个文件对象。它有我需要的路径。我最终要做的就是将 out.flush() 添加到最后,现在它可以正常工作了。不过谢谢!

标签: java printwriter bukkit


【解决方案1】:

你需要打电话...

out.flush();

...就在您打电话之前...

out.close();

PrintWriter 使用内存中的缓冲区来更有效地使用磁盘。您需要调用 flush() 来告诉 PrintWriter 写入您的数据。

【讨论】:

  • @people,如果调用 close(),则不需要显式调用 flush。
  • @GanGnaMStYleOverFlowErroR - 仔细检查 PrintWriter.close 的源代码。它与首先刷新流的 BufferedWriter.close 不同。 PrintWriter 没有。您需要将 FileWriter 包装在 PrintWriter 中的 BufferedWriter 中,以避免调用 flush
  • @GuidoSimone 我只是在没有显式调用 flush() 的情况下对其进行了测试,它确实通过调用 flush() 来刷新数据。
  • @GanGnaMStYleOverFlowErroR - 有趣。做了同样的实验,得到了同样的结果。哦,好吧...谢谢。
【解决方案2】:

您很可能已经多次运行此程序,并且正在写入一个文件并检查另一个文件。我怀疑文件名是一样的,但目录,可能基于工作目录的目录不是你想象的那样。

在这种情况下关闭调用刷新,因为 PrintWriter 使用 BufferedWriter 并且其他 Writer 类没有缓冲。

  251       public void flush() throws IOException {
  252           synchronized (lock) {
  253               flushBuffer();
  254               out.flush();
  255           }
  256       }
  257   
  258       public void close() throws IOException {
  259           synchronized (lock) {
  260               if (out == null) {
  261                   return;
  262               }
  263               try {
  264                   flushBuffer();
  265               } finally {
  266                   out.close();
  267                   out = null;
  268                   cb = null;
  269               }
  270           }
  271       }

【讨论】:

  • 其实这个只运行一次。我添加了使用 out.flush() 的建议,现在代码可以完美运行。不过谢谢! :)
  • flush 不应该有任何区别,因为 close 总是调用 flush。
【解决方案3】:

完成后,您需要刷新或关闭流。退出前两者都非常重要。 关闭会自动调用flush()。

【讨论】:

  • 啊,我忘了刷新功能。谢谢!
  • @people,如果调用 close(),则不需要显式调用 flush。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多