[PR] 迷惑メール トップページプロ3ゼミJavaJava入門講座三学期単位14 →4時間目

4時間目 ファイル入出力(長いソースの改造)

14−4−1.汎用性を高める

FileSample.java
package first.java.unit14.model;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

// ファイルの入出力を行う簡単なサンプル
public class FileSample {

    // ファイル名
    private String      fileName;
    // ファイル内容
    private String[]    contents;

    // ファイル名を設定する
    public FileSample(String fileName) {

        this.fileName = fileName;
    }

    // ファイル名を返す
    public String getFileName() {

        return fileName;
    }

    // ファイル名を変更する
    public void changeFileName(String fileName) {

        this.fileName = fileName;
    }

    // ファイル内容を設定する
    public void setContents(String[] contents) {

        this.contents = contents;
    }

    // データを書き込みます
    public void write() throws IOException {

        BufferedWriter bw = null;
        try {
            bw = new BufferedWriter(getFileWriter());
            for (int i = 0; i < contents.length; i++) {
                bw.write(contents[i]); // ファイルにファイル内容を書き込む
            }
            bw.flush(); // バッファをフラッシュします
        } catch (NullPointerException e) {
            // 書き込むデータが設定されていない場合
            System.out.println(fileName + ":書き込むデータが設定されていません。");
            throw e;
        } catch (IOException e) {
            // ファイル内容の書き出しに失敗した場合
            System.err.println(fileName + ":データ書き込みに失敗しました。");
            throw e;
        } finally {
            if (bw != null) {
                try {
                    bw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    // ファイルの作成して出力キャラクタ・ストリームを返す
    private FileWriter getFileWriter() throws IOException {

        FileWriter fw = null;
        try {
            fw = new FileWriter(fileName); // ファイル名のファイルを新規または読み込む
        } catch (IOException e) {
            // ファイルの書き出しまたは読み込み失敗した場合
            System.err.println(fileName + ":オープンできませんでした。");
            throw e;
        }

        return fw;
    }

    // データを読み込む画面に出力します
    public void read() throws IOException {

        List list = new ArrayList();
        BufferedReader br = null;
        try {
            br = new BufferedReader(getFileReader());
            String content = br.readLine();
            while (content != null) {
                list.add(content); // リストにコンテンツを追加
                content = br.readLine();
            }
        } catch (IOException e) {
            // データの読み込みに失敗した場合
            System.err.println(fileName + ":データ読み込みに失敗しました。");
            throw e;
        } finally {
            if (br != null) {
                try {
                    br.close(); // ファイルのクローズ
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            contents = list.toArray(new String[0]);
        }
    }

    // ファイルの作成して入力キャラクタ・ストリームを返す
    private FileReader getFileReader() throws FileNotFoundException {

        FileReader fr = null;
        try {
            fr = new FileReader(fileName); // ファイル名のファイルを読み込む
        } catch (FileNotFoundException e) {
            // ファイルの読み込みに失敗した場合
            System.err.println(fileName + ":オープンできません。ファイルを確認して下さい。");
            throw e;
        }

        return fr;
    }

    // ファイル内容を画面に出力する
    public void view() {

        // ファイル内容がある場合だけ表示
        System.out.println("-----ファイル内容はここから-----");
        for (int i = 0; i < contents.length; i++) {
            System.out.println(contents[i]);
        }
        System.out.println("-----ファイル内容はここまで-----");
    }
}

Sample14_4_1.java
package first.java.unit14.sample;

import java.io.IOException;

import first.java.unit14.model.FileSample;

// 単位14 4時間目 サンプル1
public class Sample14_4_1 {

    // ここからスタート
    public static void main(String[] args) {

        // ファイル内容を作成
        String[] contents = { "データ内容を", "改行\nすると", "こうなります" };

        FileSample fs = new FileSample("Sample14_4_1.txt");
        fs.setContents(contents); // ファイル内容を設定
        try {
            fs.write();
        } catch (IOException e) {
            e.printStackTrace();
        }
        fs.view();

        try {
            fs.read();
        } catch (IOException e) {
            e.printStackTrace();
        }
        fs.view();
        
    }
}
-----ファイル内容はここから-----
データ内容を
改行
すると
こうなります
-----ファイル内容はここまで-----
-----ファイル内容はここから-----
データ内容を改行
するとこうなります
-----ファイル内容はここまで-----

 まずは、少しずつ変更してみるのが、長いソースに慣れるためのコツです。
「FileSample」クラスのメソッドを外部から利用できるようにアクセス修飾子を 「public」に変更しました。

14−4−2.Fileクラスを利用する

 Javaにはファイルを管理する為の「File」クラスがあり、ファイル情報のやり取りに 利用されています。
「File」クラスに対応する入出力ストリームクラスも多いです。
「File」クラスに対応するように「FileSample」クラスを変更してみましょう。
その前に、「File」クラスの簡単な説明をします。
●Fileクラス
 「File」クラスは、ファイルに関する情報を定義したクラスです。
以下に、Fileクラスのコンストラクタとメソッドを表にしました。
・Fileクラスのコンストラクタ
コンストラクタ名と引数 説明
File(String path) pathからFileクラスのオブジェクトを作成する
File(String path, String name) path(ディレクトリ)からname(ファイル名)のFileクラスのオブジェクトを作成する

・Fileクラスのメソッド
戻り値型 メソッド名と引数 スローされる例外 説明
String getName() 無し ファイル名を返す。但しパス名は含まれない
String getPath() 無し パス名を返す
String getAbsolutePath 無し パス付のファイル名を返す
アクセスできない場合は、SecurityException例外をスローする
String getParent() 無し 親ディレクトリ名を返す
File getParentFile() 無し 親ディレクトリを返す
boolean renameTo(File dest) 無し destオブジェクトのファイル名に変更し結果を返す。
セキュリティ上ファイル名を変更できない場合は、SecurityException例外をスローする。
destがnullの場合は、NullPointerException例外をスローする
boolean exists() 無し ファイルが存在するかを返す。
セキュリティ上ファイルを参照できない場合は、SecurityException例外をスローする
boolean canRead() 無し ファイルが読み込み可能かを返す。
セキュリティ上ファイルを参照できない場合は、SecurityException例外をスローする
boolean canWrite() 無し ファイルが書き込み可能かを返す。
セキュリティ上ファイルを参照できない場合は、SecurityException例外をスローする
boolean isFile() 無し ファイルかを返す。
セキュリティ上ファイルを参照できない場合は、SecurityException例外をスローする
boolean isDirectory() 無し ディレクトリかどうかを返す。
セキュリティ上ファイルを参照できない場合は、SecurityException例外をスローする
boolean isAbsolute() 無し ファイル名が絶対パス名かどうかを返す
long length() 無し ファイルサイズを返す
boolean delete() 無し ファイルを削除し結果を返す。
セキュリティ上ファイルを参照できない場合は、SecurityException例外をスローする
boolean createNewFile IOException ファイルを作成し結果を返す。
セキュリティ上ファイルを参照できない場合は、SecurityException例外をスローする
boolean mkdir() 無し ディレクトリを作成し結果を返す。
セキュリティ上ファイルを参照できない場合は、SecurityException例外をスローする
String[] list() 無し ディレクトリの場合のみファイル一覧を返す。
セキュリティ上ファイルを参照できない場合は、SecurityException例外をスローする

 それでは、Fileクラスを使用したサンプルを見てみましょう。

Sample14_4_2.java
package first.java.unit14.sample;

import java.io.File;
import java.io.IOException;

//単位14 4時間目 サンプル2
public class Sample14_4_2 {

    // ここからスタート
    public static void main(String[] args) {

        File file = new File("D:\\Java", "Sample14_4_2.txt");   // ディレクトリ名とファイル名を設定
        try {
            file.createNewFile();   // ファイルを作成
        } catch (IOException e) {
            e.printStackTrace();
        }

        if (file.exists()) {
            // ファイルが存在する場合
            System.out.println("ファイル名:" + file.getName());
            System.out.println("親ディレクトリ名:" + file.getParent());
            System.out.println("パス名:" + file.getAbsolutePath());
        }
        
        System.out.println();
        
        File directory = file.getParentFile();  // 親ディレクトリを取得
        String[] fileNames = directory.list();  // ディレクトリのファイル名を取得
        System.out.println("ファイル一覧");
        for (int i = 0; i <  fileNames.length; i++) {
            System.out.println(fileNames[i]);
        }
    }
}
ファイル名:Sample14_4_2.txt
親ディレクトリ名:D:\Java
パス名:D:\Java\Sample14_4_2.txt

ディレクトリの中身一覧
Sample14_4_1.txt
Sample14_4_2.txt

それでは、「FileSample.java」を「File」クラスを使い変更してみましょう。
FileSample.java
package first.java.unit14.model;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

// ファイルの入出力を行う簡単なサンプル
public class FileSample {

	private File		file;
	// ファイル内容
	private String[]	contents;

	// ファイル名を設定する
	public FileSample(String fileName) {

		file = new File(fileName);
	}

	// ファイル名を返す
	public String getFileName() {

		return file.getName();
	}

	// ファイル名を変更する
	public void chageFileName(String fileName) {

		File chageFile = new File(fileName);
		file.compareTo(chageFile);
	}

	// ファイル内容を設定する
	public void setContents(String[] contents) {

		this.contents = contents;
	}

	// データを書き込みます
	public void write() throws IOException {

		BufferedWriter bw = null;
		try {
			bw = new BufferedWriter(getFileWriter());
			for (int i = 0; i < contents.length; i++) {
				bw.write(contents[i]); // ファイルにファイル内容を書き込む
			}
			bw.flush(); // バッファをフラッシュします
		} catch (NullPointerException e) {
			// 書き込むデータが設定されていない場合
			System.out.println(file.getName() + ":書き込むデータが設定されていません。");
			throw e;
		} catch (IOException e) {
			// ファイル内容の書き出しに失敗した場合
			System.err.println(file.getName() + ":データ書き込みに失敗しました。");
			throw e;
		} finally {
			if (bw != null) {
				try {
					bw.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	// ファイルの作成して出力キャラクタ・ストリームを返す
	private FileWriter getFileWriter() throws IOException {

		FileWriter fw = null;
		try {
			fw = new FileWriter(file); // ファイル名のファイルを新規または読み込む
		} catch (IOException e) {
			// ファイルの書き出しまたは読み込み失敗した場合
			System.err.println(file.getName() + ":オープンできませんでした。");
			throw e;
		}

		return fw;
	}

	// データを読み込む画面に出力します
	public void read() throws IOException {

		List list = new ArrayList();
		BufferedReader br = null;
		try {
			br = new BufferedReader(getFileReader());
			String content = br.readLine();
			while (content != null) {
				list.add(content); // リストにコンテンツを追加
				content = br.readLine();
			}
		} catch (IOException e) {
			// データの読み込みに失敗した場合
			System.err.println(file.getName() + ":データ読み込みに失敗しました。");
			throw e;
		} finally {
			if (br != null) {
				try {
					br.close(); // ファイルのクローズ
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			contents = list.toArray(new String[0]);
		}
	}

	// ファイルの作成して入力キャラクタ・ストリームを返す
	private FileReader getFileReader() throws FileNotFoundException {

		FileReader fr = null;
		try {
			fr = new FileReader(file); // ファイル名のファイルを読み込む
		} catch (FileNotFoundException e) {
			// ファイルの読み込みに失敗した場合
			System.err.println(file.getName() + ":オープンできません。ファイルを確認して下さい。");
			throw e;
		}

		return fr;
	}

	// ファイル内容を画面に出力する
	public void view() {

		// ファイル内容がある場合だけ表示
		System.out.println("-----ファイル内容はここから-----");
		for (int i = 0; i < contents.length; i++) {
			System.out.println(contents[i]);
		}
		System.out.println("-----ファイル内容はここまで-----");
	}
}
実行方法と結果は同じです。

3時間目 ファイル入出力(ファイルストリームの説明)に戻る    

トップページに戻る