Schrodinger的错误,除非手动检查,否则BufferedWriter不会写入TXT

sta*_*tor 7 java eclipse lwjgl bufferedwriter slick

我是一名新手程序员 - 想要成为这个问题但我找不到答案.
我使用Eclipse,并为我使用的程序slicklwjgl-2.9.3
以下代码处于一个状态,在public void update(...)中

我有这部分代码的问题:(
file.txt存在且名称中没有大写字母,giveToFile是一个字符串)(没有抛出异常)

try{
    BufferedWriter bw = new BufferedWriter(new FileWriter("src/file.txt"));
    bw.write(giveToFile);
    bw.close();
}catch(IOException e){
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

(编辑:

try{
    bw = new BufferedWriter(new FileWriter("src/file.txt"));
    bw.write(giveToFile);
    bw.flush();
}catch(IOException e){
    e.printStackTrace();
}finally {
    if (bw != null){
        try {
           bw.close();
       }catch (Throwable t){
           t.printStackTrace();
       }
   }
}  
Run Code Online (Sandbox Code Playgroud)

产生了同样的bug)

我在try块的末尾放置了一个System.out.print,它运行正常,只运行一次.我还使用了g.drawString,并且giveToFile总是给出了预期的String.我执行了以下两个实验.(该程序是一个游戏性的东西,你根据你的表现得到最终得分,并将其置于高分然后重写TXT文件.)(我建议之前阅读TLDR.)

实验1(file.txt:"0 0 0 0 0")(成功):

  1. 我运行该计划并获得15分.
    - 从txt加载的字符串:"0 0 0 0 0"
    - giveToFile(string):"15 0 0 0 0"
  2. 我双击Eclipse左侧的TXT文件(包浏览器),它在一个新选项卡中打开,我在txt里面看到:"15​​ 0 0 0 0",我关闭了标签
  3. 我再次运行该程序并获得30分.
    - 从文本引出的字符串:"15 0 0 0 0"
    - giveToFile(String):"30 15 0 0 0"
  4. 我双击Eclipse左侧的TXT文件(包浏览器),它在一个新选项卡中打开,我在txt里面看到:"30 15 0 0 0",我关闭了标签
  5. 我最后一次运行该程序并获得0分.
    - 从txt加载的字符串:"30 15 0 0 0"
    - giveToFile(string):"30 15 0 0 0"

实验2(file.txt:"0 0 0 0 0")(失败):

  1. 我运行该计划并获得15分.
    - 从txt加载的字符串:"0 0 0 0 0"
    - giveToFile(string):"15 0 0 0 0"
  2. 我双击Eclipse左侧的TXT文件(包浏览器),它在一个新选项卡中打开,我在txt里面看到:"15​​ 0 0 0 0",我关闭了标签
  3. 我再次运行该程序并获得30个字体.
    - 从文本引出的字符串:"15 0 0 0 0"
    - giveToFile(String):"30 15 0 0 0"
  4. 我没有双击TXT文件,我不打开它在一个新的选项卡,我不检查它.
  5. 我最后一次运行该程序并获得0分.
    - 来自txt的字符串:"15 0 0 0 0"
    - giveToFile(string):"15 0 0 0 0"

TLRD:除非我手动检查,否则程序不会写入TXT文件

有一个错误,但没有,取决于我是否检查txt文件

抱歉这个问题很长,对不起,如果它是超级简单的东西,但我是初学者,在互联网上找不到任何解决方案,感谢提前帮助

编辑:

我用它来关闭程序:( xpos和ypos是鼠标坐标)(基本上是一个原始的退出按钮)

if((xpos>= 200 && xpos <= 400) && (ypos>=100 && ypos <=200)){
    if(Mouse.isButtonDown(0)){
        System.exit(0);
    }
}  
Run Code Online (Sandbox Code Playgroud)

我得到了这个:(没有例外)

Thu Apr 30 16:44:14 CEST 2015 INFO:Slick Build#237
Thu Apr 30 16:44:14 CEST 2015 INFO:LWJGL版本:2.9.3
Thu Apr 30 16:44:14 CEST 2015信息:OriginalDisplayMode:1366 x 768 x 32 @ 60Hz
Thu Apr 30 16:44:14 CEST 2015 INFO:TargetDisplayMode:600 x 600 x 0 @ 0Hz
Thu Apr 30 16:44:15 CEST 2015 INFO:开始显示
600x600 Thu Apr 30 16:44:15 CEST 2015 INFO:使用Java PNG Loader = true
Thu Apr 30 16:44:15 CEST 2015 INFO:控制器不可用

这部分读取文件,没有其他部分对文件做任何事情,读者工作正常:

try{
    InputStream is = getClass().getResourceAsStream("/file.txt");
    Scanner fileIn = new Scanner(is);
    for(int i=0; i<SCOREMAX; i++){
        scoreInt[i] = fileIn.nextInt();
    }
    fileIn.close();
}catch (Exception e) {
    e.printStackTrace();
}  
Run Code Online (Sandbox Code Playgroud)

它位于public void init和SCOREMAX的类型之内public static final int

Men*_*ena 4

你需要closeBufferedWriter你的finally街区。

或者,您可以flush选择BufferedWriter完成try写入后进入块,尽管该close操作将首先刷新它。

这是一个重新审视的 Java 6 风格的示例:

BufferedWriter bw = null;

try {
    bw = new BufferedWriter(new FileWriter("src/file.txt"));
    bw.write(giveToFile);
    // bw.flush(); // if needed
}
catch(IOException e){
    e.printStackTrace();
}
finally {
    if (bw != null) {
        try {
            bw.close();
        }
        catch (Throwable t) {
            t.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

...和 ​​Java 7 风格(“尝试使用”和AutoClosables):

try (BufferedWriter bw = new BufferedWriter(new FileWriter("src/file.txt"))) {
    bw.write(giveToFile);
    bw.flush();
}
catch(IOException e){
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

  • `close` 应该调用 `flush`。另外,如果没有抛出异常,为什么它是否在“finally”中很重要? (2认同)