gpt4 book ai didi

java - BufferedWriter 和 Calendar.getTime() 的问题 : If BufferedWriter has to wait, Calendar 对象卡住

转载 作者:行者123 更新时间:2023-11-29 07:43:16 25 4
gpt4 key购买 nike

我正在使用一种简单的方法将字符串写入我的应用程序中的文件,如下所示:

dateFormat = new SimpleDateFormat("dd MMMM YYYY HH:mm:ss");
cal = Calendar.getInstance();

public boolean writeToFile(String daten) {
try {
in = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(myFile, true), "UTF-8"));
in.write(dateformat.format(cal.getTime());
in.write(daten);
in.newLine();
in.close();
}
}

这工作正常,但最多有三个客户端使用此方法写入同一个文件。好处是:如果另一个客户端正在写入,BufferedWriter 会等到他可以打开文件,然后写入该行。

但现在出现了一个问题,即在您重新打开应用程序之前,某些计算机上的时间戳将是相同的。所以 dateformat.format(cal.getTime()); 似乎没有返回实际日期,而是返回了一个更复杂的时间。

我猜如果文件暂时无法访问并且 BufferedReader 等待,就会出现问题。因此,dateformat.format(cal.getTime()) 卡住了。

这是一个已知问题吗?有人知道如何解决吗?谢谢!

最佳答案

Calendar 基本上是一个 Date,它也知道如何将自纪元以来的毫秒数划分为任意分割,例如日、周、月等。cal.getTime() 仅返回自纪元以来的毫秒数作为 Date

这意味着 cal.getTime() 返回的值从您第一次调用 Calendar.getInstance() 时起就是固定的。它永远不会返回当前时间。这与作者无关(作者绝对与任何事情无关)。这就是函数的工作原理。

您应该只在需要代表当前时间的 Date 时使用 new Date()。将 Calendar 排除在外。

正如@Dario 在他的评论中指出的那样,DateFormat.format 不是线程安全的!每个线程都应该有自己的实例。

最后,不要使用 YYYY,请使用 yyyy!大写 Y 是周年,即指定 Date 日历周的大部分时间所在的年份。这意味着它返回 2014 年 12 月 29 日的 2015(如果您在一种每周从星期一开始而不是星期日开始的文化中),因为那个星期在 2014 年有三天,在 2015 年有四天。我的一个 friend 因为这个错误而让她公司的企业应用程序陷入停顿!

关于java - BufferedWriter 和 Calendar.getTime() 的问题 : If BufferedWriter has to wait, Calendar 对象卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28046991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com