ファイルを読み書きする
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")); } }