【发布时间】:2015-07-10 07:15:09
【问题描述】:
我是一名新手程序员,想成为一名程序员,遇到了这个我找不到答案的问题。
我使用Eclipse,对于程序我使用slick 和lwjgl-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();
}
(编辑:
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();
}
}
}
产生了同样的错误)
我在try块的最后放置了一个System.out.print,它运行正常,而且只运行一次。我还使用了 g.drawString,giveToFile 总是给出预期的字符串。我执行了以下两个实验。 (这个程序是一个游戏式的东西,你在最后根据你的表现得到一个分数,它把它放在高分中,然后重写 TXT 文件。)(我建议之前阅读 TLDR。)
实验1(file.txt:“0 0 0 0 0”)(成功):
- 我运行程序并获得 15 分。
- 从 txt 加载的字符串:“0 0 0 0 0”
- giveToFile(字符串):“15 0 0 0 0" - 我双击左侧 Eclipse 中的 TXT 文件(包资源管理器),它在新选项卡中打开,我在 txt 中看到:“15 0 0 0 0”,我关闭选项卡
- 我再次运行程序并获得 30 分。
- 从文本引导的字符串:“15 0 0 0 0”
- giveToFile(字符串):“30 15 0 0 0" - 我双击左侧 Eclipse 中的 TXT 文件(包资源管理器),它在新选项卡中打开,我在 txt 中看到:“30 15 0 0 0”,我关闭选项卡
- 我最后一次运行程序并获得 0 分。
- 从 txt 加载的字符串:“30 15 0 0 0”
- giveToFile(字符串): "30 15 0 0 0"
实验2(file.txt:“0 0 0 0 0”)(失败):
- 我运行程序并获得 15 分。
- 从 txt 加载的字符串:“0 0 0 0 0”
- giveToFile(字符串):“15 0 0 0 0" - 我双击左侧 Eclipse 中的 TXT 文件(包资源管理器),它在新选项卡中打开,我在 txt 中看到:“15 0 0 0 0”,我关闭选项卡
- 我再次运行程序并获得 30 个 ponts。
- 由文本引导的字符串:“15 0 0 0 0”
- giveToFile(字符串):“30 15 0 0 0" - 我没有双击 TXT 文件,我没有在新选项卡中打开它,也没有检查它。
- 我最后一次运行程序并获得 0 分。
- 从 txt 加载的字符串:“15 0 0 0 0”
- giveToFile(字符串): “15 0 0 0 0”
TLRD:除非我手动检查,否则程序不会写入 TXT 文件
有bug,也没有,取决于我是否检查txt文件
很抱歉这个问题很长,如果它是超级简单的东西,很抱歉,但我是初学者,在互联网上找不到任何解决方案,提前感谢您的帮助
编辑:
我用这个来关闭程序:(xpos和ypos是鼠标坐标)(基本上是一个原始的退出按钮)
if((xpos>= 200 && xpos <= 400) && (ypos>=100 && ypos <=200)){
if(Mouse.isButtonDown(0)){
System.exit(0);
}
}
我得到了这个:(没有例外)
2015 年 4 月 30 日星期四 16:44:14 CEST 信息:Slick Build #237
2015 年 4 月 30 日星期四 16:44:14 CEST 信息:LWJGL 版本:2.9.3
2015 年 4 月 30 日星期四 16:44:14 CEST 信息:OriginalDisplayMode:1366 x 768 x 32 @60Hz
2015 年 4 月 30 日星期四 16:44:14 CEST 信息:目标显示模式:600 x 600 x 0 @0Hz
2015 年 4 月 30 日星期四 16:44:15 CEST 信息:开始显示 600x600
2015 年 4 月 30 日星期四 16:44:15 CEST 信息:使用 Java PNG 加载器 = true
2015 年 4 月 30 日星期四 16:44:15 CEST 信息:控制器不可用
这部分读取文件,没有其他部分对文件做任何事情,阅读器工作正常:
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();
}
它在 public void init 内,SCOREMAX 的类型是public static final int
【问题讨论】:
-
在
bw.close();之前你累了吗bw.flush(); -
@BrettWalker
close调用flush。 -
根据您提供的数据,我最好的猜测是,您在 Eclipse 上打开的(旧)副本配置为在程序执行后自动同步到文件系统。这会将磁盘上的文件副本反转为旧版本(您打开的版本)。要验证您可能根本不想打开文件并多次运行该程序。如果可行,您可以运行程序并检查文件副本上的每次迭代(简单地手动复制)。如果两者都有效,我会倾向于我的观察。
-
@Reut Sharabani BufferdWriter 的 close 方法刷新它的内部缓冲区,但它不会在底层 Writer 上调用 flush。
-
@Reut Sharabani 我只打开了 Eclipse,并且只从 Eclipse 中打开了 file.txt(它在 Eclipse 中的新选项卡中显示),file.txt 从未在单独的窗口中弹出。没有在 Eclipse 中打开它,只是运行了几次程序,写的都不行。
标签: java eclipse lwjgl slick bufferedwriter