【问题标题】:Locking an XLSX file for reading and writing with FileInputStream, FileOutputStream, and RandomAccessFile使用 FileInputStream、FileOutputStream 和 RandomAccessFile 锁定 XLSX 文件以进行读写
【发布时间】:2016-01-27 16:53:26
【问题描述】:

我有一个 Excel,我想在每个分叉进程正在读取和写入它时锁定它。 Apache poi 要求我使用FileInputStreamFileOutputStream 来读取和写入该文件,但是我看到的所有锁定文件以进行读取和写入的示例都使用RandomAccessFile,但是当我这样做时,当我打电话给workbook.write(os); 我得到一个 org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeExceptionexcel 损坏。以下是部分代码:

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

    }

【问题讨论】:

    标签: java apache-poi filelock


    【解决方案1】:

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

    【讨论】:

    • 好建议!尝试这样的事情我什至没有想到。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多