<?xml version="1.0" encoding="utf-8"?><!DOCTYPE article  PUBLIC '-//OASIS//DTD DocBook XML V4.4//EN'  'http://www.docbook.org/xml/4.4/docbookx.dtd'><article><articleinfo><title>ファイル入力</title><revhistory><revision><revnumber>28</revnumber><date>2009-11-25 00:33:32</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>27</revnumber><date>2009-11-24 02:08:42</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>26</revnumber><date>2009-11-24 02:07:11</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>25</revnumber><date>2009-11-24 02:05:37</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>24</revnumber><date>2009-11-21 01:56:34</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>23</revnumber><date>2009-11-21 01:55:55</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>22</revnumber><date>2009-11-21 01:54:45</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>21</revnumber><date>2009-11-21 01:51:49</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>20</revnumber><date>2009-11-21 01:36:17</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>19</revnumber><date>2009-11-21 01:32:22</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>18</revnumber><date>2009-11-21 01:28:53</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>17</revnumber><date>2009-11-21 01:25:53</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>16</revnumber><date>2009-11-21 01:07:37</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>15</revnumber><date>2009-11-21 01:06:10</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>14</revnumber><date>2009-11-21 01:02:42</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>13</revnumber><date>2009-11-21 00:58:44</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>12</revnumber><date>2009-11-20 12:50:04</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>11</revnumber><date>2009-11-20 12:46:00</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>10</revnumber><date>2009-11-20 12:28:35</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>9</revnumber><date>2009-11-20 12:19:49</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>8</revnumber><date>2009-11-20 12:18:53</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>7</revnumber><date>2009-11-20 08:09:28</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>6</revnumber><date>2009-11-20 08:04:14</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>5</revnumber><date>2009-11-20 07:19:58</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>4</revnumber><date>2009-11-20 07:19:01</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>3</revnumber><date>2009-11-20 07:18:53</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>2</revnumber><date>2009-11-20 07:18:43</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>1</revnumber><date>2009-11-20 05:55:20</date><authorinitials>masahiko</authorinitials></revision></revhistory></articleinfo><section><title>ファイル入力</title><para>ファイル入出力のために、 つぎの４つをスーパークラスとする数十個のクラスが用意されています。 </para><itemizedlist><listitem override="none"><para>InputStream　バイト入力 </para></listitem><listitem override="none"><para>OutputStream　バイト出力 </para></listitem><listitem override="none"><para>Reader　テキスト入力 </para></listitem><listitem override="none"><para>Writer　テキスト出力 </para></listitem></itemizedlist><para>なおこの４つは抽象クラスのため、直接利用することはできません。 </para><!--rule (<hr>) is not applicable to DocBook--><section><title>概要</title><para>テキスト形式のファイルからの入力には Readerクラスのサブクラスである BufferedReader クラスを利用します。 </para><para>BufferedReader クラスの readLineメソッドを使うことで１行ずつ読み取ることができます。 </para><para>利用する機能は次の３つです。 </para><itemizedlist><listitem override="none"><programlisting format="linespecific" language="java" linenumbering="numbered" startinglinenumber="1"><![CDATA[ ]]><methodname><![CDATA[BufferedReader]]></methodname><![CDATA[ ]]><methodname><![CDATA[b]]></methodname><![CDATA[;]]>
<![CDATA[ ]]><methodname><![CDATA[String]]></methodname><![CDATA[ ]]><methodname><![CDATA[s]]></methodname><![CDATA[;]]>

<![CDATA[ ]]><methodname><![CDATA[b]]></methodname><![CDATA[ = ]]><token><![CDATA[new]]></token><![CDATA[ ]]><methodname><![CDATA[BufferedReader]]></methodname><![CDATA[( ... );]]>
<![CDATA[ ]]><methodname><![CDATA[s]]></methodname><![CDATA[ = ]]><methodname><![CDATA[b]]></methodname><![CDATA[.]]><methodname><![CDATA[readLine]]></methodname><![CDATA[();]]>
<![CDATA[ ]]><methodname><![CDATA[b]]></methodname><![CDATA[.]]><methodname><![CDATA[close]]></methodname><![CDATA[();]]>
</programlisting></listitem><listitem override="none"><para>４行目で、BufferedReaderクラスのインスタンスを作ります。 </para></listitem><listitem override="none"><para>５行目で、このインスタンスを使ってreadLineメソッドを使って１行分読み取り、結果を文字列sに代入しています。 </para></listitem><listitem override="none"><para>６行目で、ファイルを閉じています。 </para></listitem></itemizedlist><para>ファイルを使い終わったときには、ファイルを閉じる処理が必要です。</para><para> ファイルの使い始めのopenは必要ありません。インスタンスを作ればよい。 </para><!--rule (<hr>) is not applicable to DocBook--></section><section><title>インスタンスの作成</title><para>BufferedReaderインスタンスを作成するときには、 コンストラクタの引数としてFileReaderのインスタンスを与える必要があります。 </para><para>FileReaderコンストラクタの引数にはファイル名を与えます。 </para><itemizedlist><listitem override="none"><screen><![CDATA[ FileReader f;
 f = new FileReader( "filename" );
 b = new BufferedReader( f );]]></screen></listitem></itemizedlist><para>インスタンスfはここでしか用いないので、次のように記述することもある。 </para><itemizedlist><listitem override="none"><screen><![CDATA[ b = new BufferedReader( new FileReader( "filename" ) );]]></screen></listitem></itemizedlist><para>ファイル名や１文字ごとの情報はFileReaderインスタンスの状態として保持され、 行単位の情報はBufferedReaderインスタンスの状態として保持されると考えればよい。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%85%A5%E5%8A%9B?action=AttachFile&amp;do=get&amp;target=filereader1.png"/></imageobject><textobject><phrase>filereader1.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>処理はBufferedReaderインスタンスへのメソッドを通して行います。 </para><!--rule (<hr>) is not applicable to DocBook--></section><section><title>各行の入力</title><para>readLineメソッドはファイルの終わりに達したときは null を返します。</para><para> ファイルを１行づつ読んで終わりまで処理するには、５行目を次のように修正します。 </para><itemizedlist><listitem override="none"><screen><![CDATA[ while( true )
 {
     s = b.readLine();
     if(s == null)
         break;
 //  各行での必要な処理はここに書く
 }]]></screen></listitem></itemizedlist><para>これと同じ内容を、次のように書くこともできます。 </para><itemizedlist><listitem override="none"><screen><![CDATA[ while( (s = b.readLine() ) != null)
 {
 //  各行での必要な処理はここに書く
 }]]></screen></listitem></itemizedlist><!--rule (<hr>) is not applicable to DocBook--><para> ここまでをまとめると次のようになります。 </para><itemizedlist><listitem override="none"><programlisting format="linespecific" language="java" linenumbering="numbered" startinglinenumber="1"><![CDATA[ ]]><methodname><![CDATA[FileReader]]></methodname><![CDATA[ ]]><methodname><![CDATA[f]]></methodname><![CDATA[;]]>
<![CDATA[ ]]><methodname><![CDATA[BufferedReader]]></methodname><![CDATA[ ]]><methodname><![CDATA[b]]></methodname><![CDATA[;]]>
<![CDATA[ ]]><methodname><![CDATA[String]]></methodname><![CDATA[ ]]><methodname><![CDATA[s]]></methodname><![CDATA[;]]>
<![CDATA[ ]]>
<![CDATA[ ]]><methodname><![CDATA[f]]></methodname><![CDATA[ = ]]><token><![CDATA[new]]></token><![CDATA[ ]]><methodname><![CDATA[FileReader]]></methodname><![CDATA[( ]]><phrase><![CDATA["filename"]]></phrase><![CDATA[ );]]>
<![CDATA[ ]]><methodname><![CDATA[b]]></methodname><![CDATA[ = ]]><token><![CDATA[new]]></token><![CDATA[ ]]><methodname><![CDATA[BufferedReader]]></methodname><![CDATA[( ]]><methodname><![CDATA[f]]></methodname><![CDATA[ );]]>
<![CDATA[ ]]>
<![CDATA[ ]]><token><![CDATA[while]]></token><![CDATA[( (]]><methodname><![CDATA[s]]></methodname><![CDATA[ = ]]><methodname><![CDATA[b]]></methodname><![CDATA[.]]><methodname><![CDATA[readLine]]></methodname><![CDATA[()) != ]]><symbol><![CDATA[null]]></symbol><![CDATA[)]]>
<![CDATA[ {]]>
<![CDATA[        ]]><lineannotation><![CDATA[// 各行での必要な処理はここに書く]]></lineannotation>
<lineannotation></lineannotation><![CDATA[ }]]>
<![CDATA[ ]]>
<![CDATA[ ]]><methodname><![CDATA[b]]></methodname><![CDATA[.]]><methodname><![CDATA[close]]></methodname><![CDATA[();]]>
</programlisting></listitem></itemizedlist><!--rule (<hr>) is not applicable to DocBook--></section><section><title>例外処理</title><para>プログラム実行中になんらかの例外が起こることがあります。 </para><para>例外が起こったときにプログラムの実行を中断するのではなく、なんらかの処理を行うよう記述できます。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%85%A5%E5%8A%9B?action=AttachFile&amp;do=get&amp;target=reigai1.png"/></imageobject><textobject><phrase>reigai1.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>例外処理の記述には try,cahtch 構文を用います。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%85%A5%E5%8A%9B?action=AttachFile&amp;do=get&amp;target=reigai2.png"/></imageobject><textobject><phrase>reigai2.png</phrase></textobject></inlinemediaobject> </para></listitem><listitem><para>１番目の(try)ブロックに通常の処理(図の青の部分)を記述します。 </para></listitem><listitem><para>例外には受け取る例外の型と変数を記述します。 </para></listitem><listitem><para>後ろの(catch)ブロックには例外が起こったときの処理(図の赤の部分)を記述します。 </para></listitem></itemizedlist><para>ブロックは </para><itemizedlist><listitem override="none"><para>{ で始まり </para></listitem><listitem override="none"><para>文を必要なだけ書き </para></listitem><listitem override="none"><para>} で終わりました。 </para></listitem></itemizedlist><para>通常は次のように記述します。 catchの箇所のインデントの仕方が、他の場合と違います。 </para><itemizedlist><listitem override="none"><screen><![CDATA[ try
 {
     ...
 } catch(...) {
     ...
 }]]></screen></listitem></itemizedlist><!--rule (<hr>) is not applicable to DocBook--></section><section><title>ファイル入力時の例外処理</title><para>ファイル入力時には例外が発生する可能性があるので、必ずtry,catchを書きます。 </para><para>ファイルを開く(インスタンスを作る)ところから、ファイルを閉じるところまでの範囲をtryのブロックにし、 その後ろにcatchを加えます。 </para><para>ファイル入力のときの例外は Exception型とし変数名をつけます。 </para><para>ファイル sample.txt の内容を表示するプログラムは次のように書けます。 </para><programlisting format="linespecific" language="java" linenumbering="numbered" startinglinenumber="1"><token><![CDATA[public]]></token><![CDATA[ ]]><token><![CDATA[class]]></token><![CDATA[ ]]><methodname><![CDATA[ReadSample]]></methodname>
<![CDATA[{]]>
<![CDATA[        ]]><token><![CDATA[public]]></token><![CDATA[ ]]><token><![CDATA[static]]></token><![CDATA[ ]]><token><![CDATA[void]]></token><![CDATA[ ]]><methodname><![CDATA[main]]></methodname><![CDATA[(]]><methodname><![CDATA[String]]></methodname><![CDATA[[] ]]><methodname><![CDATA[args]]></methodname><![CDATA[)]]>
<![CDATA[        {]]>
<![CDATA[                ]]><token><![CDATA[try]]></token>
<![CDATA[                {]]>
<![CDATA[                        ]]><methodname><![CDATA[FileReader]]></methodname><![CDATA[ ]]><methodname><![CDATA[f]]></methodname><![CDATA[;]]>
<![CDATA[                        ]]><methodname><![CDATA[BufferedReader]]></methodname><![CDATA[ ]]><methodname><![CDATA[b]]></methodname><![CDATA[;]]>
<![CDATA[                        ]]><methodname><![CDATA[String]]></methodname><![CDATA[ ]]><methodname><![CDATA[s]]></methodname><![CDATA[;]]>
<![CDATA[                        ]]>
<![CDATA[                        ]]><methodname><![CDATA[f]]></methodname><![CDATA[ = ]]><token><![CDATA[new]]></token><![CDATA[ ]]><methodname><![CDATA[FileReader]]></methodname><![CDATA[( ]]><phrase><![CDATA["sample.txt"]]></phrase><![CDATA[ );]]>
<![CDATA[                        ]]><methodname><![CDATA[b]]></methodname><![CDATA[ = ]]><token><![CDATA[new]]></token><![CDATA[ ]]><methodname><![CDATA[BufferedReader]]></methodname><![CDATA[( ]]><methodname><![CDATA[f]]></methodname><![CDATA[ );]]>
<![CDATA[                        ]]>
<![CDATA[                        ]]><token><![CDATA[while]]></token><![CDATA[( (]]><methodname><![CDATA[s]]></methodname><![CDATA[ = ]]><methodname><![CDATA[b]]></methodname><![CDATA[.]]><methodname><![CDATA[readLine]]></methodname><![CDATA[()) != ]]><symbol><![CDATA[null]]></symbol><![CDATA[)]]>
<![CDATA[                        {]]>
<![CDATA[                                ]]><methodname><![CDATA[System]]></methodname><![CDATA[.]]><methodname><![CDATA[out]]></methodname><![CDATA[.]]><methodname><![CDATA[println]]></methodname><![CDATA[( ]]><methodname><![CDATA[s]]></methodname><![CDATA[ );]]>
<![CDATA[                        }]]>
<![CDATA[                        ]]>
<![CDATA[                        ]]><methodname><![CDATA[b]]></methodname><![CDATA[.]]><methodname><![CDATA[close]]></methodname><![CDATA[();]]>
<![CDATA[                } ]]><token><![CDATA[catch]]></token><![CDATA[(]]><methodname><![CDATA[Exception]]></methodname><![CDATA[ ]]><methodname><![CDATA[e]]></methodname><![CDATA[) {]]>
<![CDATA[                        ]]><methodname><![CDATA[System]]></methodname><![CDATA[.]]><methodname><![CDATA[out]]></methodname><![CDATA[.]]><methodname><![CDATA[println]]></methodname><![CDATA[( ]]><methodname><![CDATA[e]]></methodname><![CDATA[ );]]>
<![CDATA[                }]]>
<![CDATA[        }]]>
<![CDATA[}]]>
</programlisting><!--rule (<hr>) is not applicable to DocBook--></section><section><title>パッケージを利用する</title><para>Javaであらかじめ用意されているクラスはパッケージに分けて管理されています。 </para><para>上に示したプログラムをコンパイルしようとすると、FileReaderやBufferedReaderが分かりません、というエラーが出ます。 </para><para>利用するクラスがどのパッケージに含まれているかを示さなければなりません。 </para><itemizedlist><listitem override="none"><para>FileReaderとBufferedReaderはjava.ioパッケージに含まれています。 </para></listitem></itemizedlist><para>書き方１ <emphasis role="strong">クラス名をフルネームで書く</emphasis> </para><itemizedlist><listitem override="none"><para>クラスのフルネームとはパッケージ名とクラス名をピリオドではさんでつないだものです。 </para></listitem><listitem override="none"><para>プログラム中で使われている箇所をフルネームに修正します。 </para></listitem><listitem override="none"><para>例 </para><itemizedlist><listitem override="none"><para>java.io.FileReader </para></listitem><listitem override="none"><para>java.io.BufferedReader </para></listitem></itemizedlist></listitem></itemizedlist><para>書き方２ <emphasis role="strong">import文でフルネームを書く</emphasis> </para><itemizedlist><listitem override="none"><para>プログラムの先頭にimport文を追加し、利用するクラス名をフルネームで書く。 </para></listitem><listitem override="none"><para>これによりプログラム中ではフルネームで書かなくても、省略してクラス名だけで使える。 </para></listitem><listitem override="none"><para>例 </para><itemizedlist><listitem override="none"><para>import java.io.FileReader; </para></listitem><listitem override="none"><para>import java.io.BufferedReader; </para></listitem></itemizedlist></listitem></itemizedlist><para>書き方３ <emphasis role="strong">import文でパッケージを指定する</emphasis> </para><itemizedlist><listitem override="none"><para>プログラムの先頭にimport文を追加し、利用するパッケージを書く。 </para></listitem><listitem override="none"><para>同じパッケージ内の複数のクラスを利用するときは、パッケージの後ろに * をつけて示すことができる。 </para></listitem><listitem override="none"><para>例 </para><itemizedlist><listitem override="none"><para>import java.io.*; </para></listitem></itemizedlist></listitem></itemizedlist></section></section></article>