2016-01-27 33 views
1

我有一个excel,当每个分支进程正在读取和写入时,我想锁定它。 Apache poi要求我使用FileInputStreamFileOutputStream来读取和写入该文件,但是我已经看到锁定文件进行读取和写入的所有示例使用RandomAccessFile,但是当我这样做时,当我拨打workbook.write(os);时,我得到 org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeExceptionexcel变得损坏。下面是一些代码:锁定用FileInputStream,FileOutputStream和RandomAccessFile读写的XLSX文件

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(); 

    } 

回答

2

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

+0

伟大的建议!尝试这样的事情甚至没有跨过我的脑海。谢谢。 – aoatley

相关问题