2017-10-16 31 views
0

は、私は、このようなロジックを持っている私のロックされたファイル内のXMLデータを書きたいが、私のファイルのデータは、このテキストデータに置き換えられていないと私はロックされたファイルにデータを書き込む方法は?

のように、この例外が発生しました:「メインスレッドで例外を sun.nioでsun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:199)で sun.nio.ch.FileChannelImpl.ensureOpen(FileChannelImpl.java:110)の「 java.nio.channels.ClosedChannelException .cs.StreamEncoder.writeBytes(StreamEncoder.java:218)at sun.nio.cs.StreamEncoder.implClose(StreamEncoder.java:316)at sun.nio.cs.StreamEncoder.close(StreamEncoder.java:149)at jav org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) で で java_io_Closeable $ close.call(不明なソース)でa.io.BufferedWriter.close(BufferedWriter.java:266) org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117) at 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(); 

    } 
+0

最後に 'w.close()'を呼び出していますか? –

+0

はいi do ..... ,,,,,, –

+0

更新されたコード例はコンパイルされません( 'ini'は' try'ブロックで宣言され、 'finally'ではアクセスできません) –

答えて

1

基本的にストリームを作成/開くのと反対の順序で閉じる必要があります。

winiの後に閉じられているようです。 wを終了しようとすると、既に閉じられている基になるストリームiniを閉じようとします。

ini.close()の前にw.close()を移動するか、w.close()の後にini.close()を移動してください。

+0

ところで、このコードでは、関連するファイルを空にするためにw.rite( "")を書くだけで十分かどうか分かりますか? w =新しいBufferedWriter(Channels.newWriter(ini.getChannel()、 "UTF-8")); w.write( ""); w.write(text); –

+0

空のファイルを作るために、 'write()'は必要ありません。それを開け閉めするだけでそれを行うべきです。 'write(" ")'は実際に何もしません。 – jurez

+0

私は、私はこのファイルで何かを書くときには、すでに私は私、私は私の新しく更新されたデータが追加さしかし、あなたはここに 'RandomAccessFile'を使用している –

関連する問題