在项目中,遇到一个需求是读取日志文件内容,解析后将内容写入到html文件中。
日志文件介绍,每一行表示一条交易信息。读取一行的一条信息将其解析,即使对数据进行处理,之后写入到html文件中。
读文件采用的是正则表达式,每匹配到一条信息就解析。
在写入html文件时,会出现一个线程正在进行写操作,而另一个线程也要访问文件。为了避免写内容时出现混乱情况,这样的情况是不允许发生的。这时就需要对文件进行加锁处理。即使一个线程在对文件进行操作时,其他线程是不能对文件进行操作的。
解决的思路是,每当有线程访问文件时就对文件进行加锁处理,写操作完毕之后释放锁。其他线程只有获得锁才能对文件进行操作。否则就一直等待,直到获得文件锁。
之前用的是 ReentrantLock 这个类对文件进行加锁。下面是代码:
private final ReentrantLock lock = new ReentrantLock();
public void doVMenuAccessOutPutHtml(File file, ServiceData sd) {
RandomAccessFile out = null;
lock.lock();
try {
if (!file.exists()) {
file.createNewFile();
out = new RandomAccessFile(file, "rw");
writehead(out);
writeVMenuHead(out);
writefoot(out);
}
out = new RandomAccessFile(file, "rw");
String style = "";
if (count.get() % 2 == 0) {
style = " <tr>\r\n<td> ";
} else {
style = " <tr class=\"alt\">\r\n<td> ";
}
StringBuffer sb = new StringBuff