我有一个 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();
}
不要在实际共享文件上使用RandomAccessFile
、FileChannel
和FileLock
,请尝试创建并锁定单独的虚拟文件。这样,成功的进程就不会在 Excel 文件上看到异常锁定或其他活动。