MASATOの開発日記


前の開発日記 次の開発日記 一覧

2003/10/04

しばらく前までJavaのコードを書いていたのですが、最近はC++のコードを書いています。 最近は、コンテナ関連のクラスに、MFCのテンプレートクラス(CArrayやCList)ではなくSTL(vectorやlist)を使ってみています。 STLは、MFCのテンプレートクラスに比べ、少ないコード量でやりたい処理を実装できます。 しかし、コーディングに必要な時間はSTLの方がずっと多いです。 意味不明なコンパイルエラーメッセージとひたすら格闘するからです。 コード量が1/5になってコーディング時間が5倍になるという感じです。 いやはや全然開発効率が上がってないです。たぶんSTLに慣れてくれば改善されると思うんですけどねー。

ファイルをロックしてDOMで読み書きする(2/2)

環境Java2 1.4 Standard Edition

前回の1つのXMLファイルを、ロックしつつDOMで読み書きする方法についてのお話です。

前回説明したChannelsExtensionクラスを使って以下のようなXMLFileクラスを作成します。 XMLFileクラスは、XMLファイルのロック、読み込み、書き込みを行う簡単にインターフェースを提供します。

import java.io.*;
import java.nio.channels.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import org.w3c.dom.*;

public class XMLFile {
  private RandomAccessFile xmlFile;
  private FileChannel fileChannel;

  public XMLFile(File file) throws FileNotFoundException, IOException {
    super();
    xmlFile = new RandomAccessFile(file, "rw");
    fileChannel = xmlFile.getChannel();
  }
  
  public XMLFile(String name) throws FileNotFoundException, IOException {
    this(new File(name));
  }
  

  public FileLock lock(boolean shared) throws IOException {
    return fileChannel.lock(0L, Long.MAX_VALUE, shared);
  }
  
  public FileLock tryLock(boolean shared) throws IOException {
    return fileChannel.tryLock(0L, Long.MAX_VALUE, shared);
  }
  
  public void read(Node node, Transformer transformer) throws IOException, TransformerException {
    fileChannel.position(0);
    Source src = new StreamSource(ChannelsExtension.newUncloseInputStream(fileChannel));
    Result result = new DOMResult(node);
    transformer.transform(src, result);
  }
  
  public void read(Node node) throws IOException, TransformerException {
    read(node, TransformerFactory.newInstance().newTransformer());
  }
  
  public void write(Node node, Transformer transformer) throws IOException, TransformerException {
    Source src = new DOMSource(node);
    fileChannel.truncate(0);
    Result result = new StreamResult(ChannelsExtension.newUncloseOutputStream(fileChannel));
    transformer.transform(src, result);
  }
  
  public void write(Node node) throws IOException, TransformerException {
    write(node, TransformerFactory.newInstance().newTransformer());
  }
  
  public void close() throws IOException {
    fileChannel.close();
    xmlFile.close();
  }
}

使い方は次のようになります。

XMLFile file = new XMLFile(new File(root, fileName));
FileLock lock = databaseFile.tryLock(false);

これで、1つのアプリケーションが、1つのファイルに対して排他的にDOMでアクセスできます。

前の開発日記 次の開発日記 一覧