第17章 テキストファイルの入出力

この章ではテキストファイルの読みこみについて説明します。

HOMEPAGE

テキストファイルの入出力


1.テキストの読み込み(FileReader偏)

ファイルからテキストを読み込むためには様々なクラスが用意されています。まずは基本となる"FileReader"クラスを使ってみます。
読み込みたいファイルを対象としてFileクラスのオブジェクトを作成して、そのオブジェクトを引数としてFileReaderクラスのオブジェクトを作成します。

File file = new File(file_name);
FileReader filereader = new FileReader(file);
FileReaderクラスは、何らかの理由で読み書きに失敗した場合は "FileNotFoundException"という例外が発生する可能性があるため、例外の処理"throws IOException"をしておかなければいけません。
※例外の処理については18章に説明します。


"read"メソッドでファイルから文字を1文字読み込めます。読み込んだ値はint型の値として取得できます。 FileReaderクラスで用意されている"read"メソッドでファイルから文字を1文字ずつ読み込めます。

File file = new File(file_name);
FileReader filereader = new FileReader(file);
例:[JSample17_1.java]
package JSample;
import java.io.FileReader;
import java.io.IOException;
public class JSample17_1 {
    public static void main(String args[]) throws IOException {

        FileReader filereader = new FileReader("C:\\test.txt");
        int ch = filereader.read();
        System.out.println((char)ch);
        filereader.close();
    }
}
実行結果(ファイル内容によって、結果が違います。)
a


"read"メソッドは先頭から1文字読み込んで、次の読み込む位置に移動して文字を読みます。
ファイルの最後に達した時に"-1"という値を返してくれます。
その為、ファイルの先頭からファイルの最後まで文字を読み込みたい場合は、"read"メソッドの結果として"-1"を返してくるまで繰り返し続けます。

例:[JSample17_2.java]

package JSample;
import java.io.FileReader;
import java.io.IOException;
public class JSample17_2 {
    public static void main(String args[]) throws IOException {

        FileReader filereader = new FileReader("C:\\test.txt");
            int ch;
            while((ch = filereader.read()) != -1){
                System.out.print((char)ch);
        }
        filereader.close();
    }
}
実行結果(ファイル内容によって、結果が違います。)
abcde


"close"メソッドはファイルに対する全ての処理が終了しましたら、ファイルを閉じます。

public void close();
例:[JSample17_3.java]
package JSample;
import java.io.File;
public class JSample17_3{
    public static void main(String args[]) throws IOException {

        FileReader filereader = new FileReader("C:\\test.txt");
        int ch = filereader.read();
        System.out.println((char)ch);
        filereader.close();
    }
}
実行結果(ローカルの環境によって、結果が違います。)
a



2.読み込みの事前確認

Fileクラスのfile.existsメソッドを使用することでファイルの存在を確認することができます。
Fileクラスのfile.canReadメソッドを使用することでファイルを読み込み可能かどうかを判別します。

private boolean checkBeforeReadfile(File file){
  if (file.exists()){
    if (file.isFile() && file.canRead()){
      return true;
    }
  }

  return false;
}
例:[JSample17_4.java]
package JSample;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class JSample17_4 {
    public static void main(String args[]) throws IOException {

            File file = new File("C:\\tests.txt");
            if (checkFile(file)) {
                System.out.println("ファイルは存在し、読み込み可能です。");
                FileReader filereader = new FileReader(file);
                int ch = filereader.read();
                System.out.print((char) ch);
                filereader.close();
            }
            else System.out.println("ファイルが見つからりません。");
    }
    private static boolean checkFile(File file) {
        if (file.exists()) {
            if (file.isFile() && file.canRead()) {
                return true;
            }
        }
        return false;
    }
実行結果(ファイルが存在した場合)
ファイルは存在し、読み込み可能です。
a

実行結果(ファイルが存在しない場合)
ファイルが見つからりません。



3-テキストの読み込み(BufferedReader偏)

FileReaderを使ってファイルを読み込む場合には、1文字読み込んでは1文字処理して、と言うのを繰り返すため、非常に効率が悪いです。その為、ある程度まとめて読み込んでから、まとめて処理するためのはBufferedReaderクラスです。

File file = new File(file_name);
FileReader filereader = new FileReader(file);
BufferedReader br = new BufferedReader(filereader);


FileReaderクラスの時と同じく"read"メソッドもありますが、1行まとめて読むためのは"readLine"メソッドです。

BufferedReaderクラスを使う場合にも、"close"メソッドを使って閉じる必要があります

public String readLine()
例:[JSample17_5.java]
package JSample;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class JSample17_5 {
    public static void main(String args[]) throws IOException {

      File file = new File("c:\\test.txt");
      BufferedReader br = new BufferedReader(new FileReader(file));

      String str = br.readLine();
      while(str != null){
        System.out.println(str);
        str = br.readLine();
      }
      br.close();
    }
}
実行結果(ファイル内容によって、結果が違います。)
abcde



4.テキストに書き込み(FileWriter偏)

ここからはテキストをファイルに書き込んでいく方法を見てみましょう。まずは基本となる"FileWriter"クラスを使います。

手順はファイルから読み込むときと似ています。テキストを書き込みたいファイルを対象にしてFileクラスのオブジェクトを作成します。そしてそのオブジェクトを引数としてFileWriterクラスのオブジェクトを作成します。

File file = new File(file_name);
FileWriter filewriter = new FileWriter(file);
FileWriterクラスは、何らかの理由で読み書きに失敗した場合は "FileNotFoundException"という例外が発生する可能性があるため、例外の処理"throws IOException"をしておかなければいけません。
※例外の処理については19章に説明します。


"write"メソッドを使って新しいテキストファイルを作ったり、すでに存在するテキストファイルに追加で文字を書き込むことができます。 FileWriteクラスを使う場合にも、"close"メソッドを使って閉じる必要があります

File file = new File(file_name);
FileWriter filewriter = new FileWriter(file);
例:[JSample17_6.java]
package Jsample;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class JSample18_1 {
    public static void main(String args[]) throws IOException {

        File file = new File("C:\\test.txt");
        FileWriter filewriter = new FileWriter(file);
        filewriter.write("こんにちは");
        filewriter.close();
    }
}
test.txtが存在しない場合、test.txtは作成して"こんにちは"を書き込みます。
test.txtが存在した場合には上書き保存されて元のファイルが削除されます。


既にファイルに書かれているテキストは消さずに、ファイルの最後に追加して書き込むためにはFileWriterクラスの2つ目の引数にtrueを追加します。

File file = new File(file_name);
FileWriter filewriter = new FileWriter(file, true);
例:[JSample17_7.java]
package Jsample;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class JSample18_2 {
    public static void main(String args[]) throws IOException {

        File file = new File("C:\\test.txt");
        FileWriter filewriter = new FileWriter(file, true);
        filewriter.write("こんにちは");
        filewriter.close();
    }
}
追加で書き込む設定でファイルが存在しない場合には、新しくファイルが作成されます。



練習

問題[JEx17_1]
writeメソッドを使用してCドライブのルートディレクトリに下記の文章を作成して、英単語の出現数をカウントしてください。

[brownfox.txt]

Java is a high-level, class-based, object-oriented programming language
that is designed to have as few implementation dependencies as possible.
実行結果
Java 1
is 2
a 1
high-level, 1
class-based, 1
object-oriented 1
programming 1
language 1
that 1
designed 1
to 1
have 1
as 2
few 1
implementation 1
dependencies 1
possible. 1



戻る