覆盖通过FileDescriptor FD获得的FileOutputStream中的属性文件



特殊的问题是当我将properties.store代码与从文件路径获得的FileOutputStream一起使用时,上述方法可以很好地工作,但当我使用从FileDescriptor获得的FileOutputStream时,附加到它的属性文件不会覆盖。

现在我的限制是使用后一种方法,因为我使用的是FileLock,无法再次通过文件获取FileOutputStream。

  1. 有可能吗?使用后一种方法执行某些操作并覆盖和
  2. 如果没有,我有什么选择

这两段代码是

首次进场

OutputStream out = null;
    try {
        if (portFile != null && portFile.exists()) {
            out = new FileOutputStream(portFile);
        } else {
            try {
                portFile.createNewFile();
            } catch (IOException e) {
                LOGGER.error("error in creating properties file ", e);
            }
            out = new FileOutputStream(portFile);
        }
    } catch (FileNotFoundException e) {
        LOGGER.error("Not able to get outputstream on properties file ", e);
    }
    try {
        properties.store(out, CJDPluginConstants.PROP_NAME_PORT_MIN);
    } catch (IOException e) {
        LOGGER.error("Not able to save properties file ", e);
    }

第二进近

// so we move to raf now
    OutputStream out = null;
    if (portFileRandomAccess != null && channel != null) {
        //ByteBuffer buffer = ByteBuffer.allocate(1024);
        try {
            if (buffer != null) {
                //if (buffer != null) {
                buffer.flip();
                LOGGER.info("buffer what we get we are writing ? " + buffer.asCharBuffer());
                out = new ByteBufferBackedOutputStream(buffer);
                FileOutputStream fos = new FileOutputStream(portFileRandomAccess.getFD());
                //fos.flush();
                properties.store(fos, CJDPluginConstants.PROP_NAME_PORT_MIN);
                buffer.clear();
                buffer = null;
                //}
            }
        } catch (IOException e) {
            LOGGER.error("Not able to save properties file ", e);
        }
    }
    //release lock, close channel
    if (lock != null) {
        try {
            lock.release();
        } catch (IOException e) {
            LOGGER.error("Error releasing lock", e);
        }
    }
    if (channel != null) {
        try {
            channel.close();
        } catch (IOException e) {
            LOGGER.error("Error closing channel", e);
        }
    }

如果您有一个FileOutputStream,无论您是如何创建的,都很容易将相关文件截断为零长度:

fileOutputStream.getChannel().truncate(0);

然后文件是空的,你可以向它写入新的内容。

也可以进行真正的覆盖,即将旧内容保留在不写入的区域:

fileOutputStream.getChannel().position(0);

然后,下一次写入到指定位置,覆盖实际写入的字节数,但保留所有其他字节。

打开RandomAccessFile不会像打开FileOutputStream那样自动截断文件。你必须手动完成,在获得锁定后:

// remove existing contents
portFileRandomAccess.setLength(0);

相关内容

  • 没有找到相关文章

最新更新