5月1日

ファイルを読み書きする
Eclipseで開発する場合、プロジェクトの直下が作業フォルダになる。
テキストでは絶対パスを記述しているが、ここでは相対パスでファイルを指定する。

package c14;

import java.io.FileReader;

public class Main16_1 {

	public static void main(String[] args) throws Exception {
		String filename = "test.txt";
		FileReader fr = new FileReader(filename);
		char c1 = (char)fr.read();
		char c2 = (char)fr.read();
		fr.close();
		System.out.println("c1=" + c1 + ", c2=" + c2);
	}

}

例外の処理をきちんとコードとして記述すると以下のようになる。

package c16;

import java.io.FileReader;
import java.io.IOException;

public class Main16_1 {

	public static void main(String[] args) {
		String filename = "src\\c16\\Account.java";
		FileReader fr = null;
		try {
			fr = new FileReader(filename);
			char c1 = (char)fr.read();
			char c2 = (char)fr.read();
			System.out.println("c1=" + c1 + ", c2=" + c2);
		} catch (Exception e) {
			e.printStackTrace();
			try {
				if (fr != null) fr.close();
			} catch (IOException e1) {}
		}
	}

}

BufferedReader を使って1行ずつ読み込み、コンソールに出力するように書き換える。

package c16;

import java.io.BufferedReader;
import java.io.FileReader;

public class Main16_1 {

	public static void main(String[] args) {
		String filename = "src\\c16\\Account.java";
		BufferedReader br = null;
		try {
			br = new BufferedReader(new FileReader(filename));
			while (br.ready()) {
				String s = br.readLine();
				System.out.println(s);
			}
		} catch (Exception e) {
			e.printStackTrace();
			try {
				if (br != null) br.close();
			} catch (Exception e1) {}
		}
	}

}

ファイルに文字を書き込んでみる。
テキストp.604のリスト16-2を、try-with-resources文で書き換えたものが以下のコード。

package c16;

import java.io.FileWriter;

public class Main16_2 {

	public static void main(String[] args) {
		String filename = "test.txt";
		try (FileWriter fw = new FileWriter(filename)) {
			fw.write('そ');
			fw.write('れ');
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

実行すると、c16プロジェクトの直下に test.txt が作られる。
表示されていない場合は、c16プロジェクトを右クリックして、「リフレッシュ」を選択すると、パッケージエクスプローラの表示が更新される。

ファイルを読み込んで別のファイルにコピーするプログラムを作成する。

package c16;

import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Copy {

	public static void main(String[] args) {
		String src = "src\\c16\\Account.java";
		String dst = "out.txt";
		try (FileInputStream in = new FileInputStream(src);
			 FileOutputStream out = new FileOutputStream(dst)) {
			while (true) {
				int c = in.read();
				if (c < 0) break;
				out.write(c);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

プログラムを実行すると、c16プロジェクトの直下に out.txt ファイルが生成される。
ファイルの内容は Account.java がコピーされている。

Webページを取得する
テキストp.605のリスト16-3を作ってみる。
アクセス先のURLは自由に指定してよい。

package c16;

import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

public class Main16_3 {

	public static void main(String[] args) {
		try {
			URL u = new URL("http://www.yahoo.co.jp");
			try (InputStream is = u.openStream()) {
				while (true) {
					int i = is.read();
					if (i < 0) break;
					char c  = (char)i;
					System.out.print(c);
				}
				System.out.println();
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}

}

実行すると、URLで指定したWebサイトのページの内容がコンソールに出力される。

FizzBuzz問題
FizzBuzz問題をTDDで実装する。

まず最初にFizzBuzzクラスを作成する。
指定した数値に対して、答えを返す say() メソッドを定義する。
とりあえず、nullを返しておく。

package tdd;

public class FizzBuzz {
	public String say(int i) {
		return null;
	}
}

[新規]-[その他]で「JUnitテスト・ケース」を選択して、テストクラスを生成する。

テスト対象メソッドは say() を選択して完了するとテストクラスが生成される。

package tdd;

import static org.junit.Assert.*;

import org.junit.Test;

public class FizzBuzzTest {

	@Test
	public void testSay1() {
		fail("まだ実装されていません");
	}
}

テストを実装する。
1のときは文字列”1″が返されることを確認するテスト。

package tdd;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.junit.Test;

public class FizzBuzzTest {

	@Test
	public void testSay1() {
		FizzBuzz fz = new FizzBuzz();
		String s = fz.say(1);
		assertThat(s, is("1"));
	}
}

テストにパスするようにFizzBuzzクラスを修正する。

package tdd;

public class FizzBuzz {
	public String say(int i) {
		return "1";
	}
}

2のテストを追加する。

package tdd;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.junit.Test;

public class FizzBuzzTest {

	@Test
	public void testSay1() {
		FizzBuzz fz = new FizzBuzz();
		String s = fz.say(1);
		assertThat(s, is("1"));
	}

	@Test
	public void testSay2() {
		FizzBuzz fz = new FizzBuzz();
		String s = fz.say(2);
		assertThat(s, is("2"));
	}
}

テストにパスするようにFizzBuzzを修正する。

package tdd;

public class FizzBuzz {
	public String say(int i) {
		return String.valueOf(i);
	}
}

3のテストを追加する。

package tdd;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.junit.Test;

public class FizzBuzzTest {

	@Test
	public void testSay1() {
		FizzBuzz fz = new FizzBuzz();
		String s = fz.say(1);
		assertThat(s, is("1"));
	}

	@Test
	public void testSay2() {
		FizzBuzz fz = new FizzBuzz();
		String s = fz.say(2);
		assertThat(s, is("2"));
	}

	@Test
	public void testSay3() {
		FizzBuzz fz = new FizzBuzz();
		String s = fz.say(3);
		assertThat(s, is("Fizz"));
	}
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です