Java 如何在锁定的文件中写入数据?
我想在锁定的文件中写入一个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) 。我应该做些什么来做这个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
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”
),这可能会比较慢。