BufferedWriter 和 Calendar.getTime() 的问题:如果 BufferedWriter 必须等待,Calendar 对象就会卡住

Problems with BufferedWriter and Calendar.getTime(): If BufferedWriter has to wait, the Calendar object becomes stuck

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

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()); 似乎不是 return 实际日期,而是更早的时间。

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

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

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

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

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

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

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

返回的时间是在Calendar.getInstance()创建实例的时间之一。也许你应该在录制时实例化它,这样你就看不到这个差距。试试这个:dateformat.format(new Date()).