锁定 XLSX 文件以使用 FileInputStream、FileOutputStream 和 RandomAcces



我有一个 excel,我希望在每个分叉进程读取和写入它时被锁定。 Apache poi 要求我使用 FileInputStreamFileOutputStream 来读取和写入该文件,但我看到的所有锁定文件以进行读取和写入的示例都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();
    }

不要在实际共享文件上使用RandomAccessFileFileChannelFileLock,请尝试创建并锁定单独的虚拟文件。这样,成功的进程就不会在 Excel 文件上看到异常锁定或其他活动。

相关内容

  • 没有找到相关文章

最新更新