Java 如何在锁定的文件中写入数据?

Java 如何在锁定的文件中写入数据?,java,Java,我想在锁定的文件中写入一个XML数据,我有这样的逻辑,但我的文件数据并没有被这个文本数据替换,我得到了这样的异常 此:线程“main”中的异常 位于的java.nio.channels.ClosedChannel异常 sun.nio.ch.FileChannelImpl.ensureOpen(FileChannelImpl.java:110)位于 sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:199)位于 writeBytes(Str

我想在锁定的文件中写入一个XML数据,我有这样的逻辑,但我的文件数据并没有被这个文本数据替换,我得到了这样的异常

此:线程“main”中的异常 位于的java.nio.channels.ClosedChannel异常 sun.nio.ch.FileChannelImpl.ensureOpen(FileChannelImpl.java:110)位于 sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:199)位于 writeBytes(StreamEncoder.java:218)位于 sun.nio.cs.streamncoder.implClose(streamncoder.java:316)位于 sun.nio.cs.streamncoder.close(streamncoder.java:149)位于 close(BufferedWriter.java:266)位于 java_io_Closeable$close.call(未知源代码)位于 org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117) 在locckGroovy.main(loccky.groovy:90)

。我应该做些什么来做这个

 RandomAccessFile ini = new RandomAccessFile(file, "rwd");
        FileLock lock = ini.getChannel().tryLock();
    try{

        w=new BufferedWriter(Channels.newWriter(ini.getChannel(),"UTF-8"));
        w.write(text);

    }finally{

    ini.close();

    }

基本上,您必须按照与创建/打开流相反的顺序关闭流

似乎
w
ini
之后被关闭。尝试关闭
w
时,它会尝试关闭已关闭的基础流
ini


w.close()
移到
ini.close()
之前,或将
ini.close()
移到
w.close()

之后,是否在末尾调用
w.close()
?是的,我会…,,,,,更新的代码示例未编译(
ini
try
块中声明,在
中无法访问)即使我从try中导出ini,并且里面只有ini.close(),它最终也不会更新文件。您仍然需要调用
w.close
,并且您需要在
ini.close
之前执行此操作。顺便问一下,您知道在代码中编写w.rite(“”)是否足以使相关文件为空?w=新的BufferedWriter(Channels.newWriter(ini.getChannel(),“UTF-8”);w、 写(“”);w、 写(文本);要生成空文件,不需要任何
write()
s。只是打开和关闭它也应该这样做
write(“”)
实际上没有任何作用。我的意思是,当我在这个文件中写东西时,它已经有了内容,我需要用我的数据替换这个数据。换句话说,我需要我的新更新的数据不被追加,而是被替换。你在这里使用的是
RandomAccessFile
,我想你可以使用
setLength(0)
将其截断。但是你真的需要一个
随机访问文件吗?如果您只需要写出一个文件,我建议您使用普通的
FileOutputStream
+
BufferedOutputStream
。每次都会创建一个新文件。还请注意,此处使用的是同步写入(
“rwd”
),这可能会比较慢。