2012-05-09 13 views
0

私はScalaでシンプルなWebサーバーを作成していますが、XMLファイルへのイベントログを実装しようとしています。 XMLの構造は、このようです:そこに私は最新のファイルをチェックインするときScala - XMLをファイルに追加する

var logEvent = 
    <log> 
<event> 
<type>ERROR</type> 
<description>The Requested File was not found</description> 
<file>{path}</file> 
<ip>{connection.getRemoteSocketAddress}</ip> 
<time>{new Date(System.currentTimeMillis)}</time> 
</event> 
</log> 

XML.save(logFile, logEvent, "UTF-8", true, null) 

しかし偶数で、ファイルを更新:

<log> 
     <event> 
      <type>Info/Warning/Error/etc</type> 
      <description>File not found etc</description> 
      <file>/etc/etc.etc</file> 
      <ip>1.2.3.4</ip> 
      <time>12:34:56 1st Jan 2012</time> 
     </event> 
     <event> 
      etc... 
     <event> 
</log> 

は現在、このようなファイルにXMLを書き込もうとイムサーバが実行されている間、各イベントはファイル内の最後のイベントを置き換えます。

また、XML.writeと一緒に有効にすることができますが、各イベントの前にXMLスキーマが挿入され、適切なXMLファイルとして認識されなくなりました。また、すべてのイベントにルート<log>タグを追加します。

私が考えることができる唯一の方法は、現在のXMLをファイルに読み込んで追加してから、それを書き直して、どちらかというと私には効率が悪いようです。

XMLが不足しているファイルに追加する簡単な方法はありますか?不足しているトップレベルのコンテナがあるので すべてのヘルプは感謝:)

答えて

0

あなたはその形式で別のログを追加する場合は、あなたの文書には、有効な XML できなくなります。
気にしない場合は、単にjava.nio.channels.FileChannelを使用します。

import java.nio._ 
import java.io._ 

def appendToFile(f: File) { 
    var foutstream: Option[FileOutputStream] = None 
    lazy val foutchannel = foutstream.get.getChannel 
    try { 
    foutstream = Some(new FileOutputStream(f, true) 
    val buffer = ByteBuffer.allocate(1024) 
    "this text will be appended" foreach (buffer.put(_.toByte)) 
    buffer.flip 
    foutchannel.write(buffer) 
    foutchannel.close 
    foutstream.get.close 
    } catch { 
    case e: Exception => e printStackTrace 
    } 
}