前回来てなかった人
テキストの以下のサンプルを入力して実行してみよう!
- WriterSample2
- ReaderSample
- FileCopy
- CloseSample
- DownloadSample
- FileSample
Java7から自動でcloseしてくれる機能が追加された。
try-with-resources文を使うと自動的にcloseしてくれる。
自動でcloseしてくれるオブジェクトは、AutoClosableインタフェースを実装しているクラス。
以下のコードを入力して、CloseSampleと比較してみよう!
CloseSample2.java
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class CloseSample2 { public static void main(String[] args) throws IOException { String src = "hoge.txt"; String dest = "hoge2.txt"; copy(dest, src); } public static void copy(String dest, String src) throws IOException { try (InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dest)) { int len; byte[] b = new byte[1024]; while (true) { len = in.read(b); if (len < 0) break; out.write(b, 0, len); } } } }
前回来ていた人
Comparatorを実装して、ファイルを日付順とサイズ順でソートできるようにしてみよう!
Dir.java
import java.io.File; import java.util.Arrays; public class Dir { public static void main(String[] args) { String path; String option = null; if (args.length == 0) { path = "."; } else { path = args[0]; option = getOption(args); } File file = new File(path); dir(file, option); } private static String getOption(String[] args) { for (String s : args) { if (s.startsWith("/")) { return s; } } return null; } static SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); private static void dir(File parent, String option) { System.out.println("option=" + option); File[] children = parent.listFiles(); if (children != null) { if (option == null) { // ソートなし } else if (option.equals("/ON")) { // 名前順 Arrays.sort(children, new FileNameComparator()); } else if (option.equals("/OD")) { // 日付順 Arrays.sort(children, new FileDateComparator()); } else if (option.equals("/OS")) { // サイズ順 Arrays.sort(children, new FileSizeComparator()); } for (int i = 0; i < children.length; i++) { File file = children[i]; String d = formatter.format(file.lastModified()); System.out.println(file.getName() + "\t" + file.length() + "\t" + d); } } } }
FileNameComparator.java
import java.io.File; import java.util.Comparator; public class FileNameComparator implements Comparator<File> { @Override public int compare(File o1, File o2) { String n1 = o1.getName(); String n2 = o2.getName(); return -n1.compareTo(n2); // マイナスをつけて逆順にしている } }
FileDateComparator.java
import java.io.File; import java.util.Comparator; public class FileDateComparator implements Comparator<File> { @Override public int compare(File o1, File o2) { long l1 = o1.lastModified(); long l2 = o2.lastModified(); if (l1 < l2) return -1; if (l2 < l1) return 1; return 0; } }
コマンドプロンプトでの実行
作業ディレクトリに移動する。
現在は、c24 プロジェクトでプログラムを作成しているので、c24 のフォルダに移動する。
> cd \All-in-One-Eclipse4.4\workspace\c24
java コマンドを実行して Dir プログラムを起動する。
> java -cp bin Dir src /OD
java : java コマンド
-cp : クラスパスを指定するオプション(クラスファイルがbinフォルダにあるため)
bin : クラスファイルがある bin フォルダを指定している
Dir : 起動するクラスファイルを指定
src : ファイルの内容を表示するフォルダを指定している
/OD : ソートのオプションを指定している
テスト駆動開発
FizzBuzz でテスト駆動開発の練習をする。
FizzBuzz.java
public class FizzBuzz { public String say(int i) { return null; } }
FizzBuzzTest.java
import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import org.junit.Test; public class FizzBuzzTest { @Test public void testSay1() { FizzBuzz fb = new FizzBuzz(); // インスタンスを生成 String s = fb.say(1); // say(1)を呼び出して結果を取得する assertThat(s, is("1")); // 結果が "1" かどうかを比較 } }