奇怪的问题是
当我使用从文件路径获取的properties.store
的{{1}}代码时,上述方法可以正常工作,但是当我从FileOutputStream
获取FileOutputStream
属性文件时附加到它,不会覆盖。
现在我的约束是使用后面的方法,因为我使用FileLock并且无法再通过文件获取FileOutputStream。
这两段代码是
第一种方法
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);
}
答案 0 :(得分:1)
打开RandomAccessFile不会像打开FileOutputStream那样自动截断文件。获得锁定后,您必须手动执行此操作:
// remove existing contents
portFileRandomAccess.setLength(0);
答案 1 :(得分:1)
如果您有FileOutputStream
,无论您如何创建它,都可以轻松地将相关文件截断为零长度:
fileOutputStream.getChannel().truncate(0);
然后该文件为空,您将新内容写入其中。
也可以进行真正的覆盖,即在未写入的区域保留旧内容:
fileOutputStream.getChannel().position(0);
然后下一次写入转到指定的位置,覆盖你真正写的字节数,但保留所有其他字节。