前の開発日記 | 次の開発日記 | 一覧 |
しばらく前までJavaのコードを書いていたのですが、最近はC++のコードを書いています。 最近は、コンテナ関連のクラスに、MFCのテンプレートクラス(CArrayやCList)ではなくSTL(vectorやlist)を使ってみています。 STLは、MFCのテンプレートクラスに比べ、少ないコード量でやりたい処理を実装できます。 しかし、コーディングに必要な時間はSTLの方がずっと多いです。 意味不明なコンパイルエラーメッセージとひたすら格闘するからです。 コード量が1/5になってコーディング時間が5倍になるという感じです。 いやはや全然開発効率が上がってないです。たぶんSTLに慣れてくれば改善されると思うんですけどねー。
環境 | 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(); } }
使い方は次のようになります。
databaseFile = new XMLFile(new File(root, fileName)); databaseLock = databaseFile.tryLock(false);
前の開発日記 | 次の開発日記 | 一覧 |