5月29日

JSTL

fmtによる書式の利用

参考URL http://www.javaroad.jp/opensource/js_taglibs4.htm

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="abc.*,java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>テーブル</title>
</head>
<body>

<%
	List<Media> list = new ArrayList<Media>();
	list.add(new Media("おはよう", "奥本", 100, 30, 86400000l));
	list.add(new Media("こんにちは", "乙女", 200, 40, 86400000l * 365));
	list.add(new Media("こんばんは", "梶原", 300, 50, 86400000l * 365 * 10));
	request.setAttribute("list", list);
%>

<table>
<tr>
  <th></th>
  <th>タイトル</th>
  <th>作者</th>
  <th>サイズ</th>
  <th>長さ</th>
  <th>作成日</th>
</tr>

<c:forEach var="m" items="${list}">
	<tr>
		<td>
		<c:if test="${m.size > 100}">New!</c:if>
		</td>
		<td>${m.title}</td>
		<td>${m.author}</td>
		<td>${m.size}</td>
		<td>${m.length}</td>
		<td><fmt:formatDate value="${m.created}" pattern="yyyy/MM/dd"/></td>
	</tr>
</c:forEach>

</table>


</body>
</html>

リクエストパラメータの利用

form を使う。
input.jsp と result.jsp を作成する。input.jsp では、form でテキスト(パラメータ名: name)を入力し、submit で result.jsp に遷移する。

input.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>テキストを入力</title>
</head>
<body>

<h1>リクエストパラメータの送信</h1>

<form action="result.jsp">
<input type="text" name="name" />
<input type="submit" value="送信" />
</form>

</body>
</html>

result.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>リクエストパラメータの受信</title>
</head>
<body>

<h1>リクエストパラメータの受信</h1>

受信したテキスト: <%=request.getParameter("name") %>

</body>
</html>

文字化けの解消

テキストに英数字を入力した場合は正常にデータが渡されるが、日本語だと文字化けする。それを解消する方法について。

POSTメソッドを使う

form で POST メソッドを使い、受信側の result.jsp でパラメータのデータ取得前に以下のスクリプトレットを追加すればよい。

<form action="result.jsp" method="post">
<%
    request.setCharacterEncoding("utf-8");
%>

GETメソッドでの対応

GETメソッドではURLにデータが含まれるため、URLデータのエンコードを指定する必要がある。

パッケージエクスプローラの Servers の下の ローカルホストの Tomcat v7.0 サーバー – config を展開し、その下の server.xml をダブルクリックして開く。画面下の「ソース」タブを選択し、”8080″を検索する(たぶん64行目)。
Connector ディレクティブの最後にuseBodyEncodingForURI=”true”の設定を追加する。

    <Connector connectionTimeout="20000"
    		   port="8080"
    		   protocol="HTTP/1.1"
    		   redirectPort="8443"
                   useBodyEncodingForURI="true" />
 

文字列に「あああ」を入力して送信したときに、URLが以下のようになっていれば設定が反映された動作になっている(name=の後の部分)。

http://localhost:8080/jsp/result.jsp?name=%E3%81%82%E3%81%82%E3%81%82

Spring MVC/Roo

「はじめに」を読んでみる。
わからない単語をリストアップする。
それぞれの単語を調べてみる。

  • MVC
  • IaaS
  • Struts
  • DI
  • AOP
  • Bean

STSのインストール

STSインストールプログラム:\\kgakusei1\share\澤田\eclipse
インストール先: C:\Users\se3\springsource
JDKのパス:C:\All-in-One-Eclipse4.3\java\7

5月26日

JSTL

HTTPメソッド

よく使われるHTTPメソッド

  • GET
  • POST
  • PUT
  • DELETE

CRUD

CRUDとSQLとHTTPメソッドは対応している。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Sample</title>
</head>
<body>

<h1>JSP Sample</h1>
<p>日本語も表示できるかな?</p>

<% int count = 10; %>
<%=count %>
<%=new java.util.Date() %>
<%-- JSPコメントです --%>
<!-- HTMLコメントです -->
<br/>

<%
	List<String> list = new ArrayList<String>();
	list.add("赤池");
	list.add("井本");
	list.add("大津");
	request.setAttribute("list", list);

	Map<String, String> map = new HashMap<String, String>();
	map.put("red", "赤");
	map.put("green", "緑");
	map.put("blue", "青");
	request.setAttribute("map", map);

	request.setAttribute("names", request.getHeaderNames());
	Enumeration<String> e = request.getHeaderNames();
	while(e.hasMoreElements()){
		String key = e.nextElement();
		out.println(key + "=" + request.getHeader(key) + "<br/>");
	}
%>

<c:forEach var="name" items="${list}">
	${name}<br/>
</c:forEach>

<c:forEach var="color" items="${map}">
	${color}<br/>
</c:forEach>



</body>
</html>

c:ifタグ

c:if タグによってJSPの中で条件分岐するコードを記述できます。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSTLのifタグ</title>
</head>
<body>

<%
	request.setAttribute("count", 10);
%>

<c:set var="count" value="15" />

<c:if test="${count == 10}">
	count: <c:out value="${count}"/>
</c:if>

</body>
</html>

c:forEach と c:if の併用

c23プロジェクトの Media クラスを再利用する。

  1. Javaリソースを右クリックして[新規]-[パッケージ]を選択
  2. 名前に abc と入力して「完了」をクリック
  3. c23 プロジェクトの Media クラスをコピー
  4. abc パッケージを右クリックして[貼り付け]を選択
  5. 新しくJSPを追加する。

    1. WebContentを右クリックして[新規]-[JSP File]を選択
    2. 名前に table.jsp と入力して「完了」をクリック
    3. index.jsp の page import と taglib ディレクティブの行を貼り付ける

    Mediaにコンストラクタを追加する。

    package abc;
    import java.util.Date;
    
    public class Media {
    	private String title;
    	private String author;
    	private Date created;
    	private int size;
    	private int length;
    
    	public Media() {
    		this("", "", 0, 0, 0);
    	}
    	public Media(String title, String author, int size, int length, long created) {
    		this.title = title;
    		this.author = author;
    		this.size = size;
    		this.length = length;
    		this.created = new Date(created);
    	}
    	public String getTitle() {
    		return title;
    	}
    	public void setTitle(String title) {
    		this.title = title;
    	}
    	public String getAuthor() {
    		return author;
    	}
    	public void setAuthor(String author) {
    		this.author = author;
    	}
    	public Date getCreated() {
    		return created;
    	}
    	public void setCreated(Date created) {
    		this.created = created;
    	}
    	public int getSize() {
    		return size;
    	}
    	public void setSize(int size) {
    		this.size = size;
    	}
    	public int getLength() {
    		return length;
    	}
    	public void setLength(int length) {
    		this.length = length;
    	}
    }
    

    JSPのスクリプトレットでMediaをListに追加する。

    table.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page import="abc.*,java.util.*" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>テーブル</title>
    <head>
    <body>
    
    <%
    	List<Media> list = new ArrayList<Media>();
    	list.add(new Media("おはよう", "奥本", 100, 0, 0));
    	list.add(new Media("こんにちは", "乙女", 200, 0, 0));
    	list.add(new Media("こんばんは", "梶原", 300, 0, 0));
    	request.setAttribute("list", list);
    %>
    
    <table>
    <tr><th>タイトル</th><th>作者</th><th>サイズ</th></tr>
    
    <c:forEach var="m" items="${list}">
    	<tr>
    		<td>${m.title}</td>
    		<td>${m.author}</td>
    		<td>${m.size}</td>
    	</tr>
    </c:forEach>
    
    </table>
    
    </body>
    </html>
    

5月22日

Webアプリケーション

WebApp

JavaによるWebアプリ開発

JSP

Eclipseで[新規]-[プロジェクト]を選択
Webの下にある[動的Webプロジェクト]を選択
プロジェクト名: jsp
ターゲットランタイムがないので「新規ランタイム」をクリック
Apache Tomcat v7.0 を選択
「次へ」をクリック
Tomcatインストールディレクトリの「参照」をクリック
「C:\All-in-One-Eclipse4.3\tomcat\7」を選択
JREは「Java7」を選択
「完了」をクリックすると、新規動的Webプロジェクトのダイアログに戻る
「次へ」→「次へ」→「完了」でプロジェクトを作成する

Eclipseの設定

[ウィンドウ]>[設定]>[Web]>[JSPファイル]を選択
エンコードを「UTF-8」に設定
[ウィンドウ]>[設定]>[Tomcat]を選択
Tomcatバージョンは「バージョン7.x」を選択
Tomcatホームは「C:\All-in-One-Eclipse4.3\tomcat\7」を選択
「OK」をクリック

Tomcatプロジェクトに設定

jspプロジェクトを右クリック
「プロパティー」を選択
左の一覧からTomcatを選択
「Tomcatプロジェクト」にチェックを入れる
「OK」をクリック

jspプロジェクトを右クリック
[Tomcatプロジェクト]-[コンテキスト定義を更新]を選択

ツールバーから Tomcat を起動する
 →コンソールに「Server startup in xxxx ms」と表示されればTomcatが起動した

Eclipseのツールバーから「Webブラウザーを開く」をクリック
URLに http://localhost:8080/ を入力すると Tomcat のサイトが表示される

パッケージエクスプローラでWebContentを右クリック
[新規]-[JSPファイル]を選択
ファイル名を index.jsp に設定

JSTLの利用

JSTLライブラリのインストール

以下のフォルダから jstl.jar と standard.jar をコピーする
C:\All-in-One-Eclipse4.3\tomcat\7\webapps\examples\WEB-INF\lib
Eclipseのjspプロジェクトの WEB-INF/lib に貼り付ける

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Sample</title>
</head>
<body>

<h1>JSP Sample</h1>
<p>日本語も表示できるかな?</p>

<% int count = 10; %>
<%=count %>
<%=new java.util.Date() %>
<%-- JSPコメントです --%>
<!-- HTMLコメントです -->

<%
	List<String> list = new ArrayList<String>();
	list.add("赤池");
	list.add("井本");
	list.add("大津");
	request.setAttribute("list", list);
%>

<c:forEach var="name" items="${list}">
	${name}<br/>
</c:forEach>
</body>
</html>

${param} の形式をEL式と呼ぶ。

参考ページ
http://struts.wasureppoi.com/jstl/02_foreach.html

暗黙オブジェクト

参考ページ
http://www.atmarkit.co.jp/ait/articles/0305/23/news002.html

5月19日

スレッド

スレッドはJavaVMで並行処理を行う仕組みです。

プロセスとスレッド

プロセスはアプリケーションが動作する単位。スレッドは、ひとつのアプリケーション内で並行処理をするための単位。

スレッドの作成方法

CHAPTER25に入ったので、新しくプロジェクトc25を作成する。

Threadクラスを使ったスレッドの利用方法の例として、テキストのLIST 25-01 MyThread.java を入力して実行する。

Runnableインタフェースを使ったスレッドの利用方法の例として、テキストのLIST 25-02 MyRunnable.java を入力して実行する。

それぞれ、クラスのファイルはクラスごとに分ける。run()メソッドのオーバーライドには、@Override アノテーションをつけておく。

ThreadクラスのJavadocを確認すると、Threadクラスもimplements Runnableしていることがわかる。

sleep()メソッドを使った例として、テキストのLIST 25-03 SleepThread.java を入力して実行する。

複数のスレッドを使用する例として、テキストのLIST 25-04 SleepThreadTest2.java を入力して実行する。

スレッドの動機

Javaでは、synchronizedキーワードを使用してスレッドの動機を行う。

スレッドを同期する例として、テキストの LIST 25-05 DojiSample.java を入力して実行する。CountThreadは、別ファイルとして作成すること。

DojiSample.java

public class DojiSample {
	Integer count = new Integer(1);

	void countUp() {
		int tmpValue = count.intValue() + 1;
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		count = new Integer(tmpValue);
	}
	void doSample() {
		new CountThread(this).start();
		new CountThread(this).start();
	}
	public static void main(String[] args) {
		new DojiSample().doSample();
	}
}

CountThread.java

public class CountThread extends Thread {
	private DojiSample dojiSample;
	public CountThread(DojiSample ds) {
		dojiSample = ds;
	}
	@Override
	public void run() {
		dojiSample.countUp();
		System.out.println(getName() + " count=" + dojiSample.count.intValue());
	}
}

synchronizedブロックを使用して動機を行う場合は、synchronized に続く括弧の中に動機のキーにするオブジェクトを記述する。たとえば、テキストの例にあるような count をキーにした場合は、キーとなっている count のインスタンスに最初にアクセスしたスレッドが実行権を獲得する。2番目のスレッドがcountをキーにしたsynchronizedブロックを実行しようとしたときに、実行が待たされる。最初に実行権を獲得したスレッドがsynchronizedブロックから抜けると、2番目のスレッドが実行権を獲得できる。

メソッドのsynchronized修飾子を使う場合は、そのメソッドが定義されているクラスのインスタンスが、動機のキーとなる。

5月15日

try-with-resources構文復習

Dirクラス動作確認

CHAPTER24まとめの練習問題

問題1解答例

package c24;

import java.io.IOException;
import java.io.PrintWriter;

public class Q1 {
	static final String FILE_NAME = "renshu.txt";
	public static void main(String[] args) {
		try (PrintWriter w = new PrintWriter(FILE_NAME)) {
			w.println("こんにちは!");
			w.println("今日も");
			w.println("元気");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

問題2解答例

package c24;
import static c24.Q1.FILE_NAME;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Q2 {

	public static void main(String[] args) {
		try (BufferedReader r = new BufferedReader(new FileReader(FILE_NAME))) {
			while (true) {
				String s = r.readLine();
				if (s == null) break;
				System.out.println(s);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

問題3解答例

package c24;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

public class Q3 {
	static final String FILE_NAME = "items.txt";
	public static void main(String[] args) {
		List<Item> items = new ArrayList<Item>();
		items.add(new Item("りんご", 5));
		items.add(new Item("バナナ", 12));
		items.add(new Item("かきぴー", 6));
		store(items);
	}

	public static void store(List<Item> items) {
		try (PrintWriter w = new PrintWriter(FILE_NAME)) {
			for (Item i : items) {
				w.println(i.asCSV());
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

問題4解答例

package c24;

import static c24.Q3.*;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class Q4 {

	public static void main(String[] args) {
		List<Item> items = load();
		for (Item i : items) {
			System.out.println(i);
		}
	}

	private static List<Item> load() {
		List<Item> items = new ArrayList<Item>();
		try (BufferedReader r = new BufferedReader(new FileReader(FILE_NAME))) {
			while (true) {
				String s = r.readLine();
				if (s == null || s.length() == 0) break;
				Item i = Item.create(s);
				items.add(i);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return items;
	}
}

5月12日

ストリーム

try-with-resources文

Java7では try-with-resources文が追加されました。try-with-resources文は、try-catch構文の中でストリームを使ったときに、ストリームのcloseに関するコードが煩雑になってしまいます。try-with-resources文を使用することで、煩雑さを解消できます。

try-with-resources文の構造は以下のとおりです。

    try ( 構文から出たときにクローズしたいリソース ) {
        // リソースを扱う処理
    }

クローズしたいリソースの中で使用できるオブジェクトは、java.lang.AutoCloseable インタフェースを実装しているものです。

以下のコードは、try-with-resources文を使用した例です。

package abc;

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

public class CloseSample2 {

	public static void main(String[] args) {
		String path = "hoge.txt";
		try (BufferedReader r = new BufferedReader(new FileReader(path))) {
			while (true) {
				String s = r.readLine();
				if (s == null) break;
				System.out.println(s);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

その他、詳しくはOracleのドキュメントを参照してください。→ try-with-resources文

Webページのコピー(ファイル以外の例)

LIST 24-08 DownloadSample.java

package c24;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;

public class DownloadSample {

	public static void main(String[] args) throws IOException {
		String dest = "dest.html";
		URL url = new URL("http://www.yahoo.co.jp/");
		InputStream in = url.openStream();
		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);
		}
		in.close();
		out.close();
	}
}

DownloadSampleを実行すると、YahooのトップページのHTMLがdest.htmlに出力される。ブラウザでdest.htmlを開くと、Yahooのトップページを表示できる。

dest.htmlを右クリックし、[次で開く]-[Webブラウザー]を選択すれば、Eclipse内でブラウザが動作する。

open

Fileクラス

LIST 24-09 FileSample.java を作成して実行する。Fileコンストラクタに渡すパスは、"."にする。

LIST 24-09 に、以下の変更を行う。

  • ディレクトリの場合は絶対パスを表示する
  • ファイルの場合はファイル名のみを表示する
  • 可能であれば、ディレクトリの階層に応じてインデントする
C:\All-in-One-Eclipse4.3\workspace\c24\.
  .classpath
  .project
C:\All-in-One-Eclipse4.3\workspace\c24\.\.settings
    org.eclipse.jdt.core.prefs
C:\All-in-One-Eclipse4.3\workspace\c24\.\bin
C:\All-in-One-Eclipse4.3\workspace\c24\.\bin\c24
      CloseSample.class
      CloseSample2.class
      DownloadSample.class
      FileCopy.class
      FileSample.class
      InputSample.class
      OutputSample.class
      ReaderSample.class
      WriterSample.class
      WriterSample2.class
  btest.bin
  dest.html
  hoge.txt
  hoge2.txt
C:\All-in-One-Eclipse4.3\workspace\c24\.\src
C:\All-in-One-Eclipse4.3\workspace\c24\.\src\c24
      CloseSample.java
      CloseSample2.java
      DownloadSample.java
      FileCopy.java
      FileSample.java
      InputSample.java
      OutputSample.java
      ReaderSample.java
      WriterSample.java
      WriterSample2.java

さらにFileクラスを使う

コマンドプロンプトの dir コマンドと同様の出力をするクラス Dir を作成する。Dirを実行すると、以下のような出力結果が得られるようにする。

2014/05/08  11:30		301	.classpath
2014/05/08  11:30		379	.project
2014/05/08  11:30	<DIR>		.settings
2014/05/08  11:32	<DIR>		bin
2014/05/08  12:10		3	btest.bin
2014/05/12  10:32		22156	dest.html
2014/05/08  12:03		59	hoge.txt
2014/05/08  12:55		59	hoge2.txt
2014/05/08  11:32	<DIR>		src

参考画像

dir

[PR] 北九州カレーフェスティバル

5月8日

Listソートの復習

Comparatorを使ったStrategyパターンです。

Mediaをソートするテスト MediaSortTest を作る。

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

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.junit.Before;
import org.junit.Test;


public class MediaSortTest {
	private List<Media> list;
	private Media m1, m2, m3, m4;

	@Before
	public void prepareMedia() {
		m1 = new Media();
		m1.setTitle("CCCCC");
		m1.setSize(400);
		m1.setAuthor("すずき");
		m2 = new Media();
		m2.setTitle("DDDDDD");
		m2.setSize(300);
		m2.setAuthor("さいとう");
		m3 = new Media();
		m3.setTitle("AAAAAA");
		m3.setSize(200);
		m3.setAuthor("ほんだ");
		m4 = new Media();
		m4.setTitle("BBBBBBBB");
		m4.setSize(100);
		m4.setAuthor("いもと");
		list = new ArrayList<Media>();
		list.add(m1);
		list.add(m2);
		list.add(m3);
		list.add(m4);
	}

	@Test
	public void test() {
		assertThat(list.get(0), is(m1));
		Collections.sort(list, new MediaTitleComparator());
		assertThat(list.get(0), is(m3));
		assertThat(list.get(1), is(m4));
		assertThat(list.get(2), is(m1));
		assertThat(list.get(3), is(m2));
		printMediaList();

		Collections.sort(list, new MediaSizeComparator());
		assertThat(list.get(0), is(m4));
		assertThat(list.get(1), is(m3));
		assertThat(list.get(2), is(m2));
		assertThat(list.get(3), is(m1));
		printMediaList();

		Collections.sort(list, new MediaAuthorComparator());
		assertThat(list.get(0), is(m4));
		assertThat(list.get(1), is(m2));
		assertThat(list.get(2), is(m1));
		assertThat(list.get(3), is(m3));
		printMediaList();
	}

	private void printMediaList() {
		for (Media m : list) {
			System.out.println(m.getTitle() + " " + m.getSize() + " " + m.getAuthor());
		}
		System.out.println();
	}
}

ソートした結果を printMediaList() メソッドでコンソールに出力するようにコードを追加。

コンソールに出力される結果は以下のとおり。

AAAAAA 200 ほんだ
BBBBBBBB 100 いもと
CCCCC 400 すずき
DDDDDD 300 さいとう

BBBBBBBB 100 いもと
AAAAAA 200 ほんだ
DDDDDD 300 さいとう
CCCCC 400 すずき

BBBBBBBB 100 いもと
DDDDDD 300 さいとう
CCCCC 400 すずき
AAAAAA 200 ほんだ

インタフェースComparatorでメソッドを定義。MediaXxxxComparator で、比較のアルゴリズムを実装。Collections.sort()メソッドが各Comparatorのインスタンスを受け取ってソートを実行する。

このようなクラスの構造をStrategy(ストラテジー)パターンと呼ぶ。

ストリーム

ストリームは、データを入出力するための機能を提供します。

Javaでは、入力と出力が分離されています。入力は InputStream、出力は OutputStream によって提供されています。特に扱うデータがテキストであれば、InputStream の代わりに Reader を、OutputStream の代わりに Writer を使用できます。

新規プロジェクト c24 を作成する。実行環境JREは「1.7」を選択する。

LIST24-01 WriterSample.java を入力して実行する。

WriterSampleを実行すると、コンソールに END と出力される。c24プロジェクトを右クリックし「リフレッシュ」を選択すると、c24 プロジェクト内に出力先ファイル hoge.txt が表示される。

Writer のデコレータを使う

LIST 24-02 WriterSample2.java を入力して実行する。実行後に hoge.txt をダブルクリックして書かれた内容を確認する。

Readerを使う

LIST 24-03 ReaderSample.java を入力して実行する。hoge.txt の内容がコンソールに表示される。

バイナリデータの入出力

OutputStreamを使う

LIST 24-04 OutputSample.java を入力して実行する。c24プロジェクトを右クリックし「リフレッシュ」を選択すると、c24 プロジェクト内に出力先ファイル btest.bin が表示される。

InputStreamを使う

LIST 24-05 InputSample.java を入力して実行する。

ファイルをコピーする

LIST 24-06 FileCopy.java を入力して実行する。

必ずcloseする

LIST 24-07 CloseSample.java を入力して実行する。

5月1日

プロジェクトをバックアップからインポートする

  1. Eclipseのメニューで[ファイル]-[インポート]を選択
  2. 一般→既存プロジェクトをワークスペースへを選択
  3. ルートディレクトリの選択でバックアップ先プロジェクトを選択
  4. 「プロジェクトをワークスペースにコピー」にチェック
  5. 「完了」をクリック

バックアップしてない人は、「\\kgakusei1\share\澤田\SE32014\c23]からインポートする。

Comparatorでオブジェクトを比較する

タイトル、作者、作成日、ファイルサイズ、長さ(時間)を比較するためのComparatorを作成してソートできるようにする。

前回の授業内容を思い出すために、テストを実行する。

タイトルを比較するためのMediaTitleComparatorを実装する。

作者名で比較するための MediaAuthorComparatorを作成する。

  1. [新規]-[クラス]で新しくクラスを作成する
  2. クラス名はMediaAuthorComparator
  3. java.util.Comparatorインタフェースを追加する
  4. インタフェースの型引数をMediaにする
  5. 「完了」でクラスを作成する

JUnitテストケースを作成する。

  1. パッケージエクスプローラでMediaAuthorComparatorを右クリックする
  2. [新規]-[その他]を選択する
  3. フィルターに ju と入力すると JUnitテストケース が現れる
  4. JUnitテストケースを選択し「次へ」をクリック
  5. さらに「次へ」をクリック
  6. 使用可能なメソッドで compare() にチェックを入れて「完了」をクリック
  7. これでテストクラスが作成される
import static org.junit.Assert.*;

import java.util.Comparator;

import org.junit.Test;


public class MediaAuthorComparatorTest {

	@Test
	public void testCompare() {
		Media m1 = new Media();
		m1.setAuthor("すずき");
		Media m2 = new Media();
		m2.setAuthor("やまだ");
		Comparator c = new MediaAuthorComparator();
		int a = c.compare(m1, m2);
		assertTrue(a < 0);
	}

}

ファイルサイズで比較するためのMediaSizeComparatorを作成する。

MediaSizeComparatorTestを作成する。

import static org.junit.Assert.*;

import java.util.Comparator;

import org.junit.Test;


public class MediaSizeComparatorTest {

	@Test
	public void testCompare() {
		Media m1 = new Media();
		m1.setSize(1000);
		Media m2 = new Media();
		m2.setSize(2000);
		Comparator c = new MediaSizeComparator();
		int a = c.compare(m1, m2);
		assertTrue(a < 0);
	}

	@Test
	public void testCompare1() {
		Media m1 = new Media();
		m1.setSize(1000);
		Media m2 = new Media();
		m2.setSize(1000);
		Comparator c = new MediaSizeComparator();
		int a = c.compare(m1, m2);
		assertTrue(a == 0);
	}

}

作成日で比較するためのMediaDateComparatorを作成する。

長さで比較するためのMediaLengthComparatorを作成する。