从通过FileDescriptor FD获取的FileOutputStream覆盖属性文件

时间:2013-12-05 07:47:35

标签: java file nio file-descriptor filelock

奇怪的问题是 当我使用从文件路径获取的properties.store的{​​{1}}代码时,上述方法可以正常工作,但是当我从FileOutputStream获取FileOutputStream属性文件时附加到它,不会覆盖。

现在我的约束是使用后面的方法,因为我使用FileLock并且无法再通过文件获取FileOutputStream。

  1. 有可能吗?用后面的方法做一些事情并覆盖和
  2. 如果不是我的选择?
  3. 这两段代码是

    第一种方法

    FileDescriptor

    第二种方法

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

2 个答案:

答案 0 :(得分:1)

打开RandomAccessFile不会像打开FileOutputStream那样自动截断文件。获得锁定后,您必须手动执行此操作:

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

答案 1 :(得分:1)

如果您有FileOutputStream,无论您如何创建它,都可以轻松地将相关文件截断为零长度:

fileOutputStream.getChannel().truncate(0);

然后该文件为空,您将新内容写入其中。

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

fileOutputStream.getChannel().position(0);

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