使用FileInputStream,FileOutputStream和RandomAccessFile锁定XLSX文件以进行读写

时间:2016-01-27 16:53:26

标签: java apache-poi filelock

我有一个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();

    }

1 个答案:

答案 0 :(得分:2)

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