<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2489819706564760729</id><updated>2024-09-07T07:36:12.038+09:00</updated><category term="Java"/><category term="ファイル"/><category term="読み込み"/><category term="XML"/><category term="プロパティ"/><category term="書き込み"/><title type='text'>ArdorCode</title><subtitle type='html'>使えるソースコードをまとめています。</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ardorcode.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2489819706564760729/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://ardorcode.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ardor</name><uri>http://www.blogger.com/profile/17897885179944302603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit7YNJ8mGwekDVzTww7491Xs2ae5Hd2bE2PT91CjqOb8jsS8ZZaTFT8BG8gIomn4Mt8c5CbJqB0pETrwvMLRgTWfKe6XBR0EVQLw5cWgedJgyWQn8YTCWBJESuhiLx5JM/s220/sns_icon_2.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>4</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2489819706564760729.post-1615573319537855819</id><published>2012-05-19T15:48:00.000+09:00</published><updated>2012-05-19T15:49:03.789+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="ファイル"/><category scheme="http://www.blogger.com/atom/ns#" term="書き込み"/><title type='text'>Javaでテキストをファイルに書き込む</title><content type='html'>テキストファイルに書き込むを行うとき必要になる情報は、次の３つであることが多いです。&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;ファイルパス または ファイル名&lt;/li&gt;
&lt;li&gt;エンコーディング&lt;/li&gt;
&lt;li&gt;追加書き込みかどうか&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
あとは１行ずつ書き込むこともあれば、テキストを一気に書き込んでしまうこともあるでしょう。&lt;br /&gt;
&lt;br /&gt;
今回は、テキストデータをファイルに書き込む方法をご紹介します。&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;

Javaでテキストをファイルに書き込みを行う際には、FileWriter、OutputStreamWriterを使用して、&lt;br /&gt;
最終的にバッファリングできる「BufferedWriter」を構築すると効率よく書き込みを行うことができます。&lt;br /&gt;
&lt;br /&gt;
FileWriterは、追加書き込みが指定できるので、既にあるファイルに追加書き込みしたいときに使うことが多いです。&lt;br /&gt;
OutputStreamWriterは、エンコーディングが指定できるので、UTF-8のファイルを出力したいときに使えます。&lt;br /&gt;
&lt;br /&gt;
実際のコードは次の通りです。&lt;br /&gt;
&lt;h4&gt;■TextFileWriter.java&lt;/h4&gt;
&lt;pre class=&quot;brush:java&quot;&gt;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;

/**
 * {@link TextFileWriter}クラスです。
 * 
 * @author ardor
 * @version 1.0
 */
public class TextFileWriter {
 
 /**
  * 文字型出力ストリーム
  */
 private BufferedWriter writer = null;
 
 /**
  * ファイルパスを指定して、ファイル書き込みインスタンスを構築します。
  * 
  * @param filePath ファイルパス
  * @throws IOException ファイルに書き込みできない場合
  */
 public TextFileWriter(String filePath) throws IOException {
  this(filePath, false);
 }
 
 /**
  * ファイルパスを指定して、ファイル書き込みインスタンスを構築します。
  * 追加書き込みを行う場合は、append に true を指定します。
  * 
  * @param filePath ファイルパス
  * @param append true:追加書き込み、false:新規書き込み
  * @throws IOException ファイルに書き込みできない場合
  */
 public TextFileWriter(String filePath, boolean append) throws IOException {
  Writer fileWriter = new FileWriter(filePath, append);
  writer = new BufferedWriter(fileWriter);
 }
 
 /**
  * ファイルパスとエンコーディングを指定して、ファイル書き込みインスタンスを構築します。
  * 
  * @param filePath ファイルパス
  * @param encoding エンコーディング
  * @throws IOException ファイルに書き込みできない場合
  */
 public TextFileWriter(String filePath, String encoding) throws IOException {
  OutputStream out = new FileOutputStream(filePath);
  Writer outWriter = new OutputStreamWriter(out, encoding);
  writer = new BufferedWriter(outWriter);
 }
 
 /**
  * 指定したテキストをファイルに書き込みます。
  * 
  * @param text テキスト
  * @throws IOException ファイルに書き込みできない場合
  */
 public void write(String text) throws IOException {
  try {
   writer.write(text);
  }
  catch(IOException e) {
   close();
   throw e;
  }
 }
 
 /**
  * 指定したテキストを書き込んで改行します。
  * 
  * @param line テキスト
  * @throws IOException ファイルに書き込みできない場合
  */
 public void writeLine(String line) throws IOException {
  try {
   writer.write(line);
   writer.newLine();
  }
  catch(IOException e) {
   close();
   throw e;
  }
 }
 
 /**
  * 文字型出力ストリームを閉じます。
  */
 public void close() {
  try {
   writer.close();
  }
  catch(Exception e) {
   // NOP
  }
 }
}
&lt;/pre&gt;
&lt;br /&gt;
コンストラクタをオーバーロードして好きなようにファイルを構築できるようにしてあります。&lt;br /&gt;
&lt;br /&gt;
大きなテキストを書き込みたい場合、通常は任意のタイミングで flush() を呼び出すのですが、
BufferedWriterは、バッファが一杯になったタイミング、またはclose()のタイミングでflush()するので、実装は行っていません。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
また主な使い方は次の通りです。&lt;br /&gt;
&lt;h4&gt;■サンプルコード&lt;/h4&gt;
&lt;pre class=&quot;brush:java&quot;&gt;
  try {
   TextFileWriter writer = new TextFileWriter(&quot;SampleUTF-8.txt&quot;, &quot;UTF-8&quot;);
   writer.writeLine(&quot;sample line改行あり&quot;);
   writer.writeLine(&quot;日本語出力テスト&quot;);
   writer.write(&quot;sample改行なし&quot;);
   writer.close();
  }
  catch(Exception e) {
   e.printStackTrace();
  }
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://ardorcode.blogspot.com/feeds/1615573319537855819/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://ardorcode.blogspot.com/2012/05/java_19.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2489819706564760729/posts/default/1615573319537855819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2489819706564760729/posts/default/1615573319537855819'/><link rel='alternate' type='text/html' href='http://ardorcode.blogspot.com/2012/05/java_19.html' title='Javaでテキストをファイルに書き込む'/><author><name>Ardor</name><uri>http://www.blogger.com/profile/17897885179944302603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit7YNJ8mGwekDVzTww7491Xs2ae5Hd2bE2PT91CjqOb8jsS8ZZaTFT8BG8gIomn4Mt8c5CbJqB0pETrwvMLRgTWfKe6XBR0EVQLw5cWgedJgyWQn8YTCWBJESuhiLx5JM/s220/sns_icon_2.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2489819706564760729.post-5229985439636545898</id><published>2012-05-13T23:23:00.000+09:00</published><updated>2012-05-14T17:35:58.575+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="ファイル"/><category scheme="http://www.blogger.com/atom/ns#" term="読み込み"/><title type='text'>Javaの拡張for文でテキストファイルを１行ずつ読み込む方法</title><content type='html'>前回、「&lt;a href=&quot;http://ardorcode.blogspot.jp/2012/05/java.html&quot;&gt;Javaでテキストファイルの読み込みを行う&lt;/a&gt;」をご紹介しました。&lt;br /&gt;
この方法で処理できる場合は良いですが、大きなテキストファイルの内容を１行ずつ読み込んで処理したい時や&lt;br /&gt;
CSVを１行ずつ読み込んで処理したい時があります。&lt;br /&gt;
&lt;br /&gt;
テキストファイルを１行ずつ読み込む時は、一般的に　BufferedReader.readLine()　を使います。&lt;br /&gt;
&lt;br /&gt;
しかし、この方法でプログラムを組むと、ソースが長くなり読みにくくなる人が多いと思います。&lt;br /&gt;
テキストファイルを読み込む処理と、テキスト内容を処理する部分をちゃんと分けて書けるとソースが読みやすくなりますが、&lt;br /&gt;
直感的に読みにくくなってしまうのがJavaの弱点ではないかと思います。&lt;br /&gt;
&lt;br /&gt;
そこで、拡張for文を使って完結に、読みやすいソースをご紹介します。&lt;br /&gt;
&lt;br /&gt;
Javaで次のようなコードを目指します！&lt;br /&gt;
（他の言語では、何もしなくてもこれで読めてしまうことが多いです。Pythonとか。）&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;
File file = new File(&quot;sample.txt&quot;);
for (String line : file) {
 // テキストファイルの１行に対する処理を記述する
 System.out.println(line);
}
&lt;/pre&gt;
上記のように書けると便利だと思いませんか？&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Javaでも同じようなソースコードを書くことが可能です。&lt;br /&gt;
拡張for文は、次の２つのインターフェースを実装するクラスを扱うことができます。&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;java.lang.Iterable&lt;/li&gt;
&lt;li&gt;java.util.Iterator&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
ListやMapなどのコレクションを扱う際によく利用するインターフェースですね。&lt;br /&gt;
これを実装したファイル読み込みクラスを作ってしまえばいいのです。&lt;br /&gt;
&lt;br /&gt;
では実際のソースコードをご紹介します。&lt;br /&gt;
&lt;h4&gt;■TextLineReader.java&lt;/h4&gt;
&lt;pre class=&quot;brush:java&quot;&gt;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.Iterator;

/**
 * {@link TextLineReader}クラスです。
 * 
 * @author ardor
 * @version 1.0
 */
public class TextLineReader implements Iterable&amp;lt;String&amp;gt; {
 
 /**
  * ファイルパス
  */
 private String filePath = null;
 
 /**
  * エンコーディング
  */
 private String encoding = null;
 
 /**
  * 指定したファイルをデフォルトエンコーディングで読む込むクラスを構築します。
  * 
  * @param filePath ファイルパス
  */
 public TextLineReader(String filePath) {
  this(filePath, null);
 }
 
 /**
  * 指定したファイルを指定エンコーディングで読み込むクラスを構築します。
  * 
  * @param filePath ファイルパス
  * @param encoding エンコーディング
  * @throws IOException ファイルが読み込めない場合
  */
 public TextLineReader(String filePath, String encoding) {
  // ファイルパス
  this.filePath = filePath;
  
  // エンコーディング
  this.encoding = encoding;
 }
 
 /**
  * テキストファイルの１行を読み込む{@link Iterator}を返します。
  * 
  * @return テキストファイル１行の反復子
  */
 @Override
 public Iterator&amp;lt;String&amp;gt; iterator() {
  try {
   return createIterator(filePath, encoding);
  }
  catch (IOException e) {
   throw new RuntimeException(e);
  }
 }
 
 /**
  * テキストファイルの１行を読み込む{@link Iterator}を返します。
  * 
  * @param filePath ファイルパス
  * @param encoding エンコーディング
  * @return テキストファイル１行の反復子
  * @throws IOException
  */
 protected Iterator&amp;lt;String&amp;gt; createIterator(String filePath, String encoding) throws IOException {
  Reader reader = null;
  if (encoding == null) {
   // 文字型入力ストリームクラス
   // デフォルトエンコーディングで読み込み
   reader = new FileReader(filePath); 
  }
  else {
   // 文字型入力ストリームクラス
   // エンコーディング指定で読み込み
   InputStream inputStream = new FileInputStream(filePath);
   reader = new InputStreamReader(inputStream, encoding);
  }
  return new TextLineBuffer(reader);
 }
 
 /**
  * {@link TextLineBuffer}クラスです。
  * テキストファイルを１行ずつ読み込みます。
  * 
  * @author ardor
  * @version 1.0
  */
 class TextLineBuffer implements Iterator&amp;lt;String&amp;gt;{
  
  /**
   * テキストファイル読み込みバッファ
   */
  private BufferedReader buff = null;
  
  /**
   * 文字型入力ストリームを指定してファイル読み込みクラスを構築します。
   * 
   * @param reader 文字型入力ストリーム
   */
  public TextLineBuffer(Reader reader) {
   buff = new BufferedReader(reader);
  }
  
  /**
   * ファイルが読み込み可能か返します。
   * 
   * @return true:読み込み可能、fa;se:読み込み不可能
   */
  @Override
  public boolean hasNext() {
   boolean hasNext = false;
   try {
    // 入力ストリームが読み込み可能か取得
    hasNext = buff.ready();
   } 
   catch (IOException e) {
    // 例外のため入力ストリームをクローズ
    close();
    throw new RuntimeException(e);
   }
   // 入力ストリームをクローズ
   if (!hasNext) {
    close();
   }
   return hasNext;
  }
  
  /**
   * ファイルの１行を読み込んで返します。
   * 
   * @return テキストファイルの１行
   */
  @Override
  public String next() {
   String next = null;
   try {
    // １行読み込み
    next = buff.readLine();
   } 
   catch (IOException e) {
    // 例外のため入力ストリームをクローズ
    close();
    throw new RuntimeException(e);
   }
   // 入力ストリームをクローズ
   if (next == null) {
    close();
   }
   return next;
  }
  
  /**
   * テキストファイルの１行削除は行いません。
   * 未対応
   */
  @Override
  public void remove() {
   // removeする処理は実装しない
  }
  
  /**
   * 入力ストリームをクローズします。
   */
  private void close() {
   try {
    buff.close();
   }
   catch(Exception e) {
    // クローズ時の例外は何も行わない
   }
  }
 }
}
&lt;/pre&gt;
&lt;br /&gt;
登場クラスは２つあります。&lt;br /&gt;
利用者が新しくnewするクラスは、TextLineReaderクラスです。&lt;br /&gt;
コンストラクタには、ファイルパス、エンコーディングを指定します。&lt;br /&gt;
これは前回ご紹介したクラスのメソッドでもお馴染みで、ファイルを読み込むための最低限の情報です。&lt;br /&gt;
&lt;br /&gt;
また、TextLineReaderは、Iterableを実装します。&lt;br /&gt;
実装メソッドであるpublic Iterator&lt;String&gt; iterator()では、ファイルを１行ずつ読み込んで返すクラスを返します。&lt;br /&gt;
ファイルを１行ずつ読み込んで返すクラスは、TextLineBufferというインナークラスです。&lt;br /&gt;
（Iteratorさえ実装してあるクラスならインナークラスでなくても可能です。）&lt;br /&gt;
&lt;br /&gt;
Iteratorの実装メソッドは、hasNext()とnext()のみ実装しました。&lt;br /&gt;
&lt;br /&gt;
それぞれ、BufferedReaderから取得できる値を返せばＯＫです。&lt;br /&gt;
また、読み込み終わったらちゃんとクローズ処理も行います。&lt;br /&gt;
&lt;br /&gt;
途中で例外が発生することがあるかもしれません！&lt;br /&gt;
しかし、インターフェースの実装メソッドからは、例外をスローできないため、&lt;br /&gt;
RuntimeExceptionにラップしてスローします。&lt;br /&gt;
ここは必要に応じて、専用のRuntimeException派生例外クラスを作るといいかもしれませんね。&lt;br /&gt;
例えば、IORuntimeExceptionクラスとか。&lt;br /&gt;
&lt;br /&gt;
以上で、拡張for文でテキストファイルを１行ずつ読み込みことができます。&lt;br /&gt;
使い方は次の通り。&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;
  TextLineReader texts = new TextLineReader(&quot;sample.text&quot;, &quot;UTF-8&quot;);
  for (String line : texts) {
   System.out.println(line);
  }
&lt;/pre&gt;
&lt;br /&gt;
これで、ファイルを読み込んだ時の処理が綺麗に実装できると思います。&lt;br /&gt;
間違っている箇所等ありましたらコメントを頂けるとうれしいです。&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://ardorcode.blogspot.com/feeds/5229985439636545898/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://ardorcode.blogspot.com/2012/05/javafor.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2489819706564760729/posts/default/5229985439636545898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2489819706564760729/posts/default/5229985439636545898'/><link rel='alternate' type='text/html' href='http://ardorcode.blogspot.com/2012/05/javafor.html' title='Javaの拡張for文でテキストファイルを１行ずつ読み込む方法'/><author><name>Ardor</name><uri>http://www.blogger.com/profile/17897885179944302603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit7YNJ8mGwekDVzTww7491Xs2ae5Hd2bE2PT91CjqOb8jsS8ZZaTFT8BG8gIomn4Mt8c5CbJqB0pETrwvMLRgTWfKe6XBR0EVQLw5cWgedJgyWQn8YTCWBJESuhiLx5JM/s220/sns_icon_2.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2489819706564760729.post-2963468349595158169</id><published>2012-05-08T22:46:00.000+09:00</published><updated>2012-05-08T23:01:03.793+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="ファイル"/><category scheme="http://www.blogger.com/atom/ns#" term="読み込み"/><title type='text'>Javaでテキストファイルの読み込みを行う</title><content type='html'>Javaでテキストファイルを読み込む場合は、Reader関連のクラスを利用します。&lt;br /&gt;
InputStream関連は、イメージデータなどのバイトデータを扱うクラスです。&lt;br /&gt;
テキストを扱うには向いていないので注意が必要です。&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
テキストファイルには、エンコーディングがあります。&lt;br /&gt;
（日本語でWindowsを利用している場合には、Shift-JISやMS932が多いです。）&lt;br /&gt;
&lt;br /&gt;
テキストを読み込む場合には、エンコーディングを意識して読み込む必要があります。&lt;br /&gt;
Javaでは、エンコーディングの指定を省略した場合、デフォルトエンコーディングが利用されます。&lt;br /&gt;
&lt;br /&gt;
デフォルトエンコーディングを確認するには、次のコードを実行してください。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;
 public static void main(String args[]) {
  System.out.println(System.getProperty(&quot;file.encoding&quot;));
 }
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
デフォルトエンコーディングで処理する場合は、FileReaderを使います。&lt;br /&gt;
エンコーディングを指定する場合には、FileInputStreamを作成してから、InputStreamReaderを使います。&lt;br /&gt;
&lt;br /&gt;
テキストはバッファリングして読み込む方が、効率が良くなります。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
テキストを読み込む処理は、次の通りです。&lt;br /&gt;
&lt;h4&gt;■TextFileReader.java&lt;/h4&gt;
&lt;pre class=&quot;brush:java&quot;&gt;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;

/**
 * {@link TextFileReader}クラスです。
 * テキストファイルを読み込みます。
 * 
 * @author ardor
 * @version 1.0
 */
public class TextFileReader {
 
 /**
  * 指定したファイルをデフォルトエンコーディングで読み込み、
  * テキストを返します。
  * 
  * @param filePath ファイルパス
  * @return ファイル内容
  * @throws IOException ファイルが読み込めない場合
  */
 public String readText(String filePath) throws IOException {
  // 文字型入力ストリームクラス
  // デフォルトエンコーディングで読み込み
  Reader reader = new FileReader(filePath);
  
  // ファイルを読み込んで、テキストを返す
  return readText(reader);
 }
 
 /**
  * 指定したファイルを指定エンコーディングで読み込み、
  * テキストを返します。
  * 
  * @param filePath ファイルパス
  * @param encoding エンコーディング
  * @return ファイル内容
  * @throws IOException ファイルが読み込めない場合
  */
 public String readText(String filePath, String encoding) throws IOException {
  // 文字型入力ストリームクラス
  // エンコーディング指定で読み込み
  InputStream inputStream = new FileInputStream(filePath);
  Reader reader = new InputStreamReader(inputStream, encoding);
  
  // ファイルを読み込んで、テキストを返す
  return readText(reader);
 }
 
 /**
  * 文字型入力ストリームからテキストを読み込んで返します。
  * 
  * @param in 文字型入力ストリーム
  * @return テキスト
  * @throws IOException 文字型入力ストリームが読み込めない場合
  */
 private String readText(Reader in) throws IOException {
  // 文字型入力ストリームを構築
  BufferedReader reader = new BufferedReader(in);
  
  // テキストバッファ
  StringBuffer buff = new StringBuffer(100);
  
  try {
   // テキスト読み込み処理
   char[] cbuf = new char[1024];
   int len = 0;
   while (0 &lt;= (len = reader.read(cbuf))) {
    buff.append(cbuf, 0, len);
   }   
  }
  finally {
   // 文字型入力ストリームをクローズ
   // BufferedReader.close()を呼び出すとコンストラクタに
   // 指定したReaderをクローズする
   close(reader);
  }
  return buff.toString();
 }
 
 /**
  * 文字型入力ストリームをクローズします。
  * 
  * @param reader 文字型入力ストリーム
  */
 private void close(Reader reader) {
  try {
   reader.close();
  }
  catch(Exception e) {
   // クローズ時の例外は何も行わない
  }
 }
}
&lt;/pre&gt;
&lt;br /&gt;
文字型入力ストリームは必ずクローズしてください。&lt;br /&gt;
ストリームを開いたままにすると無駄なインスタンスが残ってしまいます。&lt;br /&gt;
&lt;br /&gt;
使い方は、次の通り。&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;
  TextFileReader reader = new TextFileReader();
  try {
   System.out.println(reader.readText(&quot;sample.txt&quot;, &quot;UTF-8&quot;));
  }
  catch (IOException e) {
   e.printStackTrace();
  }

&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://ardorcode.blogspot.com/feeds/2963468349595158169/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://ardorcode.blogspot.com/2012/05/java.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2489819706564760729/posts/default/2963468349595158169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2489819706564760729/posts/default/2963468349595158169'/><link rel='alternate' type='text/html' href='http://ardorcode.blogspot.com/2012/05/java.html' title='Javaでテキストファイルの読み込みを行う'/><author><name>Ardor</name><uri>http://www.blogger.com/profile/17897885179944302603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit7YNJ8mGwekDVzTww7491Xs2ae5Hd2bE2PT91CjqOb8jsS8ZZaTFT8BG8gIomn4Mt8c5CbJqB0pETrwvMLRgTWfKe6XBR0EVQLw5cWgedJgyWQn8YTCWBJESuhiLx5JM/s220/sns_icon_2.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2489819706564760729.post-6211893124376297226</id><published>2012-05-03T21:28:00.001+09:00</published><updated>2012-05-08T22:18:14.010+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Java"/><category scheme="http://www.blogger.com/atom/ns#" term="XML"/><category scheme="http://www.blogger.com/atom/ns#" term="プロパティ"/><title type='text'>JavaでXMLプロパティの読み書きを行う</title><content type='html'>Javaのプロパティファイルは、手動でASCIIコードに変換するか、プロパティエディタを利用しないと扱えない。&lt;br /&gt;
特に日本語をプロパティファイルに書き込みたい場合は苦労します。
&lt;br /&gt;
&lt;br /&gt;
そこでプロパティファイルをXMLで定義してしまえば、ASCIIコード変換もプロパティエディタも必要ありません。&lt;br /&gt;
&lt;br /&gt;
XMLにするとパースが面倒と思われますが、パースする必要もありません。&lt;br /&gt;
&lt;br /&gt;
JavaでXMLプロパティを扱う方法をご紹介します。&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
読み込むXMLプロパティの形式は次の通りです。&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;■sample.properties&lt;/h4&gt;
&lt;pre class=&quot;brush:xml&quot;&gt;
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;
&amp;lt!DOCTYPE properties SYSTEM &quot;http://java.sun.com/dtd/properties.dtd&quot;&amp;gt
&lt;properties&gt;
&lt;comment&gt;コメント&lt;/comment&gt;
&lt;entry key=&quot;key001&quot;&gt;value001&lt;/entry&gt;
&lt;entry key=&quot;プロパティキー&quot;&gt;プロパティ値&lt;/entry&gt;
&lt;/properties&gt;
&lt;/pre&gt;
&lt;br /&gt;
エンコーディングは「UTF-8(デフォルト)」にしてあります。&lt;br /&gt;
&lt;br /&gt;
キーの指定は、entryタグのkey属性に記述します。&lt;br /&gt;
値の指定は、entryタグで囲まれたvalueに記述します。&lt;br /&gt;
&lt;br /&gt;
値は、改行することも可能です。ただし、改行コードが値に含まれるので注意してください。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
XMLプロパティを読み込んでプロパティインスタンスにする方法は次の通りです。&lt;br /&gt;
&lt;h4&gt;■XMLプロパティ読み込み&lt;/h4&gt;
&lt;pre class=&quot;brush:java&quot;&gt;
 /**
  * 指定したXMLプロパティファイルをロードして返します。
  * 
  * @param filePath XMLプロパティファイルパス
  * @return プロパティクラス
  * @throws IOException プロパティファイルが読み込めない場合
  */
 public Properties loadXMLProperties(String filePath) throws IOException {
  // プロパティクラスインスタンス
  Properties properties = new Properties();
  // 入力ストリーム構築
  InputStream in = new FileInputStream(filePath);
  // XML形式のプロパティファイルをロード
  // 入力ストリームはloadFromXMLでクローズされる
  properties.loadFromXML(in);
  // プロパティインスタンスを返す
  return properties;
 }
&lt;/pre&gt;
メソッド内で、 FileInputStreamを構築していますが、クローズする必要はありません。&lt;br /&gt;
loadFromXML(in)メソッド内でクローズされます。&lt;br /&gt;
&lt;br /&gt;
次に書き込む方法です。&lt;br /&gt;
&lt;h4&gt;■XMLプロパティ書き込み&lt;/h4&gt;
&lt;pre class=&quot;brush:java&quot;&gt;
 /**
  * プロパティをXMLプロパティファイルで保存します。
  * 
  * @param properties プロパティクラス
  * @param filePath XMLプロパティファイルパス
  * @param comments コメント(任意) または null
  * @throws IOException XMLファイルとして書き込みできない場合
  */
 public void storeXMLProperties(Properties properties, String filePath, String comments) throws IOException {
  OutputStream os = null;
  try {
   // 出力ストリーム構築
   os = new FileOutputStream(filePath);
   // XML形式のプロパティファイルを出力
   properties.storeToXML(os, comments);
  }
  catch (IOException e) {
   // 例外を通知
   throw e;
  }
  finally {
   // 出力ストリームをクローズ
   os.close();
  }
 }
&lt;/pre&gt;
&lt;br /&gt;
storeToXMLメソッド内では、FileOutputStreamをクローズしていないので、自分でクローズします。&lt;br /&gt;
例のソースコードでは、エンコーディングを指定していないので、UTF-8(デフォルト)になります。&lt;br /&gt;
他の文字コードを指定する場合には、storeToXML(OutputStream os, String comment, String encoding)にエンコーディングを指定してください。&lt;br /&gt;
&lt;br /&gt;
クラスの全行は次の通りです。&lt;br /&gt;
&lt;h4&gt;■XMLProperties.java&lt;/h4&gt;
&lt;pre class=&quot;brush:java&quot;&gt;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;

/**
 * {@link XMLProperties}クラスです。
 * 
 * 
 * @author ardor
 * @version 1.0
 */
public class XMLProperties {
 
 /**
  * 指定したXMLプロパティファイルをロードして返します。
  * 
  * @param filePath XMLプロパティファイルパス
  * @return プロパティクラス
  * @throws IOException プロパティファイルが読み込めない場合
  */
 public Properties loadXMLProperties(String filePath) throws IOException {
  // プロパティクラスインスタンス
  Properties properties = new Properties();
  // 入力ストリーム構築
  InputStream in = new FileInputStream(filePath);
  // XML形式のプロパティファイルをロード
  // 入力ストリームはloadFromXMLでクローズされる
  properties.loadFromXML(in);
  // プロパティインスタンスを返す
  return properties;
 }
 
 /**
  * プロパティをXMLプロパティファイルで保存します。
  * 
  * @param properties プロパティクラス
  * @param filePath XMLプロパティファイルパス
  * @param comments コメント(任意) または null
  * @throws IOException XMLファイルとして書き込みできない場合
  */
 public void storeXMLProperties(Properties properties, String filePath, String comments) throws IOException {
  OutputStream os = null;
  try {
   // 出力ストリーム構築
   os = new FileOutputStream(filePath);
   // XML形式のプロパティファイルを出力
   properties.storeToXML(os, comments);
  }
  catch (IOException e) {
   // 例外を通知
   throw e;
  }
  finally {
   // 出力ストリームをクローズ
   os.close();
  }
 }
}
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://ardorcode.blogspot.com/feeds/6211893124376297226/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://ardorcode.blogspot.com/2012/05/xml-link-xmlproperties-author-ardor.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2489819706564760729/posts/default/6211893124376297226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2489819706564760729/posts/default/6211893124376297226'/><link rel='alternate' type='text/html' href='http://ardorcode.blogspot.com/2012/05/xml-link-xmlproperties-author-ardor.html' title='JavaでXMLプロパティの読み書きを行う'/><author><name>Ardor</name><uri>http://www.blogger.com/profile/17897885179944302603</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit7YNJ8mGwekDVzTww7491Xs2ae5Hd2bE2PT91CjqOb8jsS8ZZaTFT8BG8gIomn4Mt8c5CbJqB0pETrwvMLRgTWfKe6XBR0EVQLw5cWgedJgyWQn8YTCWBJESuhiLx5JM/s220/sns_icon_2.png'/></author><thr:total>0</thr:total></entry></feed>