Webアプリケーションにおけるデータストアというと、とかくさまざまな機能を実装したデータベースサーバに目が向きがちなものです。事実、RDB(Relational DataBase)に代表されるデータベースには大量のデータを高速・簡単、かつ確実に操作するための多くの手段が提供されています。セキュリティという観点からもデータベースサーバを利用した方がなにかと有利な局面が少なくありません。
とはいえ、その一方で「データベースサーバを利用するほど、データが複雑でない」「少量のデータをできるだけ簡単に蓄積したい」、あるいはそもそも「現在の環境でデータベースサーバが利用できない」など、さまざまな前提や状況があるのも事実です。そのようなときに手軽にどのような環境でも使えるテキストファイルの利用を検討してみるのもよいでしょう。
テキストファイルはなんの付加情報も持たない代わりに、ニュートラル(中性的)な――環境に「ほとんど」依存しないファイル形式でもあります。蓄積したデータをシステム間、アプリケーション間で交換したいという場合にも、変換の必要がありません。
ここでは、テキストファイルにデータを書き込む方法を解説しましょう。
テキストファイルに対して、アクセスログを記録してみましょう。記録内容は、アクセス日時、アクセスしたURL、ユーザーエージェントとします。
<%@ page contentType="text/html;charset=Shift_JIS" import="java.io.*,java.util.*,java.text.*" %> <% BufferedWriter objBw=new BufferedWriter( new FileWriter(application.getRealPath("access.log"),true),10); StringBuffer objSb=new StringBuffer(); Calendar objCal=Calendar.getInstance(); SimpleDateFormat objFmt=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); objSb.append(objFmt.format(objCal.getTime()));objSb.append("\t"); objSb.append(request.getServletPath()); objSb.append("\t"); objSb.append(request.getHeader("user-agent"));objSb.append("\t"); objBw.write(objSb.toString() + System.getProperty("line.separator")); objBw.close(); %>
JSP&サーブレットでファイルへの書き込み機能を直接につかさどるのはFileWriterクラスの役割です。ただし、FileWriterクラスによる処理は、1文字単位に書き込みを行ってはまた処理に復帰するという非効率なものです。そこで一般的には、FileWriterクラスを直接使用するのではなく、BufferedWriterクラスを介して行うのが通例です。
BufferedWriterクラスは内部にバッファと呼ばれるデータを蓄積する空間を確保し、データが一定量たまったところでまとめて処理を行いますので、書き込み処理を効率化することができます。確保するバッファのサイズは、BufferedWriterのコンストラクタの第2引数で自由に変更することが可能です。実際の書き込みはwriteメソッドで行うことが可能です。
注:本TIPSではFileWrite/BuffredWriteクラスの基本的な使い方を説明するものです。実際のアプリケーション構築時にはファイルアクセスの排他制御等の配慮が必要になります。
Copyright © ITmedia, Inc. All Rights Reserved.