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())
.
我正在使用一种简单的方法将字符串写入我的应用程序中的文件,如下所示:
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())
.