Java7 再入門講座
 2012/02/25 第2回 岡山Javaユーザ会
岡山Javaユーザ会 吉田貴文(@zephiransas)
その前に...
お気づきだろうか?
JavaOneの
  スピーカーが
 3人もこの会場に
いるということを!
第2回
岡山Javaユーザ会
   勉強会
JavaZero
Dai☆Tokai 2012
Twitterのトレンドにものった!
Diamond Sponsor
以上!
本題へ
入ろうぜ
今
  Java5
使ってる人?
いま
Java7を押さえて
  おくべき理由
Javaの歴史は
進化と革命の
    歴史
Java7は進化
Java8は革命
来るべき
Java8の革命に
   備えよ!
JDKリリース状況

• Windows & Linux
 • JDK 1.7.3
• Mac OS X
 • 正式版はまだ
 • JDK7 Developer Preview
IDE対応状況

• Eclipse
 • 3.7.1 Indigo SR1で対応
• IntelliJ
 • 10.5以降でFull Support
Java7 Main Feature
Java7 Main Feature

• Project Coin
Java7 Main Feature

• Project Coin
• NIO.2 (More New APIs for Java Platform)
Java7 Main Feature

• Project Coin
• NIO.2 (More New APIs for Java Platform)
• InvokeDynamic
Java7 Main Feature

• Project Coin
• NIO.2 (More New APIs for Java Platform)
• InvokeDynamic
• Fork/Join framework
Java7 Main Feature

• Project Coin
• NIO.2 (More New APIs for Java Platform)
• InvokeDynamic
• Fork/Join framework
Project Coin
switch構文でのString
• 条件部分にStringを使えるようになった
• 今までは、数値のみ
String s = “”;
switch(s) {
case “hoge”:
  doHoge();
  break;
case “foo”
  doFoo();
  break;
default:
  doDefault();
}
数値表現形式の追加
• バイナリ表記
 • 2進数表記の追加
int a = 0b011001;
System.out.println(a);   //25


• アンダースコア表記
 • _で分割して表記
 • 先頭と最後にはNG
long a = 123_456_789;
System.out.println(a);   //123456789
long b = 0b011_001;      //バイナリ表記との合わせ技
System.out.println(b);   //25
int c = _123_456         //コンパイルエラー
例外のマルチキャッチ(1)
• 複数の例外を1つのcatchブロックでキャッチ
class ExceptionA extends Exception{}
class ExceptionB extends Exception{}

class MultiCatch {
  public static void test(int a) {
    try {
      if(a == 1) {
        throw new ExceptionA();
      } else {
        throw new ExceptionB();
      }
    } catch(ExceptionA | ExceptionB ex) {
      System.out.println(ex.getClass());
    }
  }
}
例外のマルチキャッチ(2)
• 例外に継承関係がある場合は注意
• 標準例外の継承関係が曖昧だとハマる
class ExceptionA extends Exception{}
class ExceptionB extends ExceptionA{}

class MultiCatch {
  public static void test(int a) {
    try {
      if(a == 1) {
        throw new ExceptionA();
      } else {
        throw new ExceptionB();
      }
    } catch(ExceptionB | ExceptionA ex) {        //コンパイルエラー
            System.out.println(ex.getClass());
        }
    }
}
例外の再送(1)
• tryブロック中にcatchした例外を再送する
• Java6とかだと・・・
class ReThrowTest {
  public static void test(int a) throws Exception {
    try {
      if(a == 1) {
                                  throws ExceptionA, ExceptionB
        throw new ExceptionA();
                                          とか書けない!
      } else {
        throw new ExceptionB();
      }
    } catch(Exception ex) {
      System.out.println(ex.getClass());
      throw ex;
    }
  }
}
例外の再送(2)
    • Java7では
class ReThrowTest {
  public static void test(int a) throws ExceptionA, ExceptionB {
    try {
      if(a == 1) {                   メソッドが本来throwsしたい
        throw new ExceptionA();
                                          例外を記述できる
      } else {
        throw new ExceptionB();
      }
    } catch(Exception ex) {
      System.out.println(ex.getClass());
      throw ex;
    }
  }
}
ジェネリクスの<>記法
 • <> = ダイヤモンド
 Map<String, Object> map1 = new
 HashMap<String, Object>();
 Map<String, Map<String, Object>> map2 =
  new HashMap<String, Map<String,
  Object>>

 • Mapとかでネストすると、右辺が冗長!
Map<String, Object> map1 =
 new HashMap<>();
Map<String, Map<String, Object>> map2 =
 new HashMap<>();
リソースを含むtry構文(1)
• tryブロックでAutoClosableなクラスを使う
• finallyでcloseとかが不要になる(自動でclose)
InputStream input = new
FileInputStream(“hoge.txt”);
try {
  doHoge(input);
} catch(Exception e) {
  System.out.println(e);
} finally {
  input.close();
}

 • finallyでcloseしてた
リソースを含むtry構文(2)
• Java7だと
try (InputStream input = new
FileInputStream(“hoge.txt”);) {
  doHoge(input);
} catch(Exception e) {
  System.out.println(e);
}

 • tryブロックを抜けたタイミングで
   InputStream#closeが自動で呼び出される
 • closeで発生した例外もcatchできる
NIO.2
NIO.2とは?
• ファイル操作用に新規に追加されたAPI
• パフォーマンスの改善(高速に動作)
• ファイルシステム関連
 • FileSystem クラス
 • HDD等、デバイスの情報を取得
• ファイル、ディレクトリ操作関連
 • Path インターフェース
 • PathsクラスとFilesクラス
• もう、Commons IOとか使わなくてもいい!
押さえておくべきは
 PathsとFiles
FileSystemクラス
• 取得方法
FileSystem fs = FileSystems.getDefault();

• getFileStores
 • ストレージの容量などが取得できる
• getPath
 • Pathを生成できる
Pathsクラス
• 基本はget
Path path1 = Paths.get(“/User/hoge/fuga.txt”);
Path path2 = Paths.get(“/User/hoge”, “fuga.txt”);


• java.io.Fileからも生成できる
File file = new File(“/User/hoge/fuga.txt”);
Path path = file.toPath();


• ここで生成したPathをFilesで使う
Filesクラス(1)
• ファイル作成
Files.createFile(path1);

• ファイル削除
Files.delete(path);

• ファイルコピー
Files.copy(path1, path2);

• ファイル移動
Files.move(path1, path2);
Filesクラス(2)
• 存在チェック
Files.exists(path);

• テンポラリファイル作成
Files.createTempFile(“prefix”,”suffix”);

• シンボリックリンク
Files.createSymbolicLink(path1, path2);
Filesクラス(3)
• テキスト読み書き
List<String> data =
    Files.readAllLines(path1, StandardCharsets.UTF8);

Files.write(path2, data, StandardCharsets.UTF8);



• バイナリ読み書き
byte[] data = Files.readAllBytes(path1);

Files.write(path2, data);
Filesクラス(4)
• 1行づつでもtry-with-resourceとかで簡単
try(BufferedReader reader =
  Files.newBufferedReader(path,StandardCharsets.UTF_8)) {
	    String line;
	    while((line = reader.readLine()) != null) {
	    	 System.out.println(line);
	    }
} catch(Exception e) {
	    System.out.println(e);
}
非同期チャネルAPI


• 非同期アクセスを実現するAPI群
 • AsynchronusSocketChannel
 • AsynchronusServerSocketChannel
 • AsynchronusFileChannel
 • AsynchronusDatagramChannel
Fork/Join Framework

• 大きなタスクを小さい粒度に分割
• 小さなタスクを並列で処理
 • マルチコア対応
• 櫻庭さんのIT Proの記事を参考に
 • http://itpro.nikkeibp.co.jp/article/
    COLUMN/20110627/361738/
まとめ
• Project Coinで記述の幅が広がった
 • 例外周りの処理が、便利に
 • ダイヤモンド、(゚д゚)ウマー
• NIO.2でファイル操作が便利&高速
 • グッバイ、Commons IO
• Java7は、早めに導入しておくが吉
 • どうしても無理・・・?
ご清聴
 ありがとう
ございました

Java7再入門講座