0
每次请求在我的网站页面时,我记录一些细节,像这样一个服务电话:如何在Java中安全地操作文件线程?
logService.logPageRequest(session, request, contentId);
此服务调用利用一个静态的文件实用程序的(我自己)方法来执行实际的更新上文件。
public static void appendToTextFile(String string, String fileRootDirectory, String subdirectory, String filename, boolean startOnNewLine) throws Exception {
// code irrelevant to the question removed
String filePath=fileDirectory+"/"+filename;
File file=new File(filePath);
if(file.exists()) {
FileWriter out = new FileWriter(filePath, true);
if(startOnNewLine) {
out.write("\r\n");
}
out.write(string);
out.close();
} else {
FileWriter out = new FileWriter(filePath);
out.write(string);
out.close();
}
每隔一段时间(假设每15分钟计划一次),我执行另一个服务,重命名此文件并开始处理它。
我想了解如何确保两个并发写入都是安全的,并且在写入过程中不会执行重命名。我想答案会是某种形式的同步。
Pavel,theInstanceOfSynchronizationObject会是什么?某种类型的公共静态对象属性?你为这些创建了一个单独的专门课程?性能如何?每次我们写入文件,我们都需要同步。我想知道这在实践中意味着什么。有些人选择写入队列而不是直接写入文件。你有没有做过这些,并且足够了解选择有意义的东西? – jacekn
public static属性是最简单的方法,虽然有点脏。 Cleaner是将一个特殊的实例传递给服务(也许是通过构造函数)。专用类不是必需的,你只需要使用Object(任何对象)能力来充当锁。虽然锁定确实需要一些时间,但它仍然比访问磁盘文件快几个数量级。所以我不会考虑它的性能问题。 –