我有一个excel,我想在每个分叉进程读取和写入时锁定。 Apache poi要求我使用FileInputStream
和FileOutputStream
来读取和写入该文件,但是我看到的锁定文件进行读写的所有示例都使用RandomAccessFile
为此,但是当我这样做的时候,当我打电话给workbook.write(os);
时,我得到了一个
org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException
并且 Excel已损坏。以下是一些代码:
try {
RandomAccessFile raf = new RandomAccessFile(path,"rw");
FileChannel channel = raf.getChannel();
FileLock lock = channel.lock(0L,Long.MAX_VALUE,true);
FileInputStream is = new FileInputStream(path);
XSSFWorkbook workbook = new XSSFWorkbook(is);
XSSFSheet sheet = workbook.getSheet(env.toUpperCase());
Iterator<Row> rowIterator = sheet.iterator();
//skip headers
rowIterator.next();
while (rowIterator.hasNext())
{
//reading and editing values in excel
}
is.close();
FileOutputStream os = new FileOutputStream(path);
workbook.write(os);
workbook.close();
os.close();
lock.release();
channel.close();
raf.close();
}
答案 0 :(得分:2)
不要在实际共享文件中使用RandomAccessFile
,FileChannel
和FileLock
,而是尝试创建并锁定单独的虚拟文件。这样,成功的过程就不会在Excel文件上看到异常锁定或其他活动。