「Java SE 7」の版間の差分
ナビゲーションに移動
検索に移動
(同じ利用者による、間の1版が非表示) | |||
1行目: | 1行目: | ||
− | ==Java SE 7== | + | ==[[Java SE 7]]== |
− | [[Java]][[SJC-P]] | + | [[Java]] | [[SJC-P]] | |
{{amazon|B005XSS8VC}} | {{amazon|B005XSS8VC}} | ||
10行目: | 10行目: | ||
*AutoCloseable は close() のみを持つ Closeable インターフェースの子 | *AutoCloseable は close() のみを持つ Closeable インターフェースの子 | ||
=====例===== | =====例===== | ||
− | import java.io. | + | import java.io.Buffered[[R]]eader; |
import java.io.BufferedWriter; | import java.io.BufferedWriter; | ||
import java.io.File; | import java.io.File; | ||
import java.io.FileNotFoundException; | import java.io.FileNotFoundException; | ||
− | import java.io. | + | import java.io.File[[R]]eader; |
import java.io.FileWriter; | import java.io.FileWriter; | ||
import java.io.IOException; | import java.io.IOException; | ||
− | public class | + | public class Automatic[[R]]esourceManagement { |
public static void main(String[] args) { | public static void main(String[] args) { | ||
− | try ( | + | try (Buffered[[R]]eader reader |
− | = new | + | = new Buffered[[R]]eader(new File[[R]]eader(new File("/home/piroto/work/test.txt"))); |
BufferedWriter writer | BufferedWriter writer | ||
= new BufferedWriter(new FileWriter(new File("/home/piroto/work/out.txt"))) | = new BufferedWriter(new FileWriter(new File("/home/piroto/work/out.txt"))) | ||
135行目: | 135行目: | ||
} | } | ||
===ファイル・ディレクトリ変更の検知=== | ===ファイル・ディレクトリ変更の検知=== | ||
− | * | + | *WatchSer[[vi]]ce の作成。このサービスはWatchKeyへのキューからなる |
− | * | + | *WatchSer[[vi]]ce でモニターしたいディレクトリ、ファイルを登録 |
*イベントをリッスンするループの開始 | *イベントをリッスンするループの開始 | ||
*イベントが発生すると、WatchKey がキューに入れられる | *イベントが発生すると、WatchKey がキューに入れられる | ||
148行目: | 148行目: | ||
import java.nio.file.WatchEvent.Kind; | import java.nio.file.WatchEvent.Kind; | ||
import java.nio.file.WatchKey; | import java.nio.file.WatchKey; | ||
− | import java.nio.file. | + | import java.nio.file.WatchSer[[vi]]ce; |
public class FileChangeNotifications { | public class FileChangeNotifications { | ||
154行目: | 154行目: | ||
public static void main(String[] args) { | public static void main(String[] args) { | ||
try { | try { | ||
− | + | WatchSer[[vi]]ce watchSer[[vi]]ce = FileSystems.getDefault().newWatchSer[[vi]]ce(); | |
Path watchDir = Paths.get("/home/piroto/work"); | Path watchDir = Paths.get("/home/piroto/work"); | ||
− | watchDir.register( | + | watchDir.register(watchSer[[vi]]ce, |
− | StandardWatchEventKinds. | + | StandardWatchEventKinds.ENT[[R]]Y_C[[R]]EATE, |
− | StandardWatchEventKinds. | + | StandardWatchEventKinds.ENT[[R]]Y_MODIFY, |
− | StandardWatchEventKinds. | + | StandardWatchEventKinds.ENT[[R]]Y_DELETE); |
while(true) { | while(true) { | ||
− | WatchKey watchKey = | + | WatchKey watchKey = watchSer[[vi]]ce.take(); |
for (WatchEvent<?> event : watchKey.pollEvents()) { | for (WatchEvent<?> event : watchKey.pollEvents()) { | ||
Kind<?> kind = event.kind(); | Kind<?> kind = event.kind(); | ||
174行目: | 174行目: | ||
} | } | ||
===フォークとジョイン=== | ===フォークとジョイン=== | ||
− | *fork/join | + | *fork/join フレームワークは、ExecuterSer[[vi]]ceインターフェースの実装 |
*複数のプロセッサーがある場合に有利 | *複数のプロセッサーがある場合に有利 | ||
=====例===== | =====例===== | ||
import java.util.concurrent.ForkJoinPool; | import java.util.concurrent.ForkJoinPool; | ||
− | import java.util.concurrent. | + | import java.util.concurrent.[[R]]ecursiveTask; |
public class ForkAndJoin { | public class ForkAndJoin { | ||
189行目: | 189行目: | ||
pool.invoke(fnc); | pool.invoke(fnc); | ||
− | System.out.println(" | + | System.out.println("[[R]]ESULT:" + fnc.get()); |
} catch (Exception e){ | } catch (Exception e){ | ||
e.printStackTrace(); | e.printStackTrace(); | ||
198行目: | 198行目: | ||
} | } | ||
/** | /** | ||
− | * @see http://docs.oracle.com/javase/jp/7/api/java/util/concurrent/ | + | * @see http://docs.oracle.com/javase/jp/7/api/java/util/concurrent/[[R]]ecursiveTask.html |
*/ | */ | ||
− | class Fibonacci extends | + | class Fibonacci extends [[R]]ecursiveTask<Integer> { |
final int n; | final int n; | ||
227行目: | 227行目: | ||
info.typea.javase7.nio.Fibonacci@4f9c205b | info.typea.javase7.nio.Fibonacci@4f9c205b | ||
info.typea.javase7.nio.Fibonacci@13105f32 | info.typea.javase7.nio.Fibonacci@13105f32 | ||
− | + | [[R]]ESULT:610 |
2020年2月16日 (日) 04:27時点における最新版
目次
Java SE 7
自動リソース管理
- close を手動で行う必要がない
- で複数のリソースを同時に管理
- java.lang.AutoCloseable インターフェースを実装する必要あり
- AutoCloseable は close() のみを持つ Closeable インターフェースの子
例
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class AutomaticResourceManagement { public static void main(String[] args) { try (BufferedReader reader = new BufferedReader(new FileReader(new File("/home/piroto/work/test.txt"))); BufferedWriter writer = new BufferedWriter(new FileWriter(new File("/home/piroto/work/out.txt"))) ) { String line = null; while((line = reader.readLine()) != null) { writer.write(line); writer.write("\n"); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
ダイヤモンド演算子
これまで
Map<String,Integer> numMap = new HashMap<String, Integer>();
<> (ダイアモンドオペレーター) シンボルを利用することで、すべての型リストを書く必要はない
new hashmap() だと、これまで通りコンパイラはタイプセーフ警告を発する
例
import java.util.HashMap; import java.util.Map; public class DiamondOperator { public static void main(String[] args) { Map<String,Integer> numMap = new HashMap<>(); } }
例外ハンドリング
- | オペレータで、複数の例外をキャッチできる
例
import java.io.FileNotFoundException; import java.nio.file.FileAlreadyExistsException; public class ExceptionHandling { public static void main(String[] args) { try { doSomethingWithMultiException(); } catch (FileAlreadyExistsException | FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private static void doSomethingWithMultiException() throws FileNotFoundException, FileAlreadyExistsException { } }
数値リテラル
- 数字リテラル _ を入れられる(値としては無視される)
- 二進数リテラル 0b で始める
例
public class NumericLiteralWIthUnderScore { public static void main(String[] args){ final int million = 1_000_000; final int binary = 0b101; System.out.println(million); System.out.println(binary); } }
文字列によるSwitch
- case ラベルでは、String.equals() で判定される
例
public class StringSwitch { public static void main(String[] args) { String[] status = {"new","old","New","Old"}; int idx = (int)(Math.random()*10d % status.length); switch (status[idx]) { case "new": System.out.println("new:" + status[idx]); break; case "old": System.out.println("old:" + status[idx]); break; default: System.out.println("other:" + status[idx]); break; } }
}
Path
- Pathはファイルパスへの簡易な参照
- java.io.File と同等で追加機能をもつ
例
import java.nio.file.Path; import java.nio.file.Paths; public class WorkingWitPath { public static void main(String[] args) { Path path = Paths.get("/home"); Path source = path.resolve("piroto/work/test.txt"); System.out.println(source); Path dist = source.resolveSibling("out.txt"); System.out.println(dist); } }
ファイル・ディレクトリ変更の検知
- WatchService の作成。このサービスはWatchKeyへのキューからなる
- WatchService でモニターしたいディレクトリ、ファイルを登録
- イベントをリッスンするループの開始
- イベントが発生すると、WatchKey がキューに入れられる
- WatchKeyを消費し、問い合わせを実行
例
import java.nio.file.FileSystems; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardWatchEventKinds; import java.nio.file.WatchEvent; import java.nio.file.WatchEvent.Kind; import java.nio.file.WatchKey; import java.nio.file.WatchService; public class FileChangeNotifications { public static void main(String[] args) { try { WatchService watchService = FileSystems.getDefault().newWatchService(); Path watchDir = Paths.get("/home/piroto/work"); watchDir.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE); while(true) { WatchKey watchKey = watchService.take(); for (WatchEvent<?> event : watchKey.pollEvents()) { Kind<?> kind = event.kind(); System.out.println(event.context().toString() + " is " + kind); } } } catch(Exception e) { e.printStackTrace(); } } }
フォークとジョイン
- fork/join フレームワークは、ExecuterServiceインターフェースの実装
- 複数のプロセッサーがある場合に有利
例
import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveTask; public class ForkAndJoin { public static void main(String[] args) { try { // n番目のフィボナッチ数を求める Fibonacci fnc = new Fibonacci(15); ForkJoinPool pool = new ForkJoinPool(); pool.invoke(fnc); System.out.println("RESULT:" + fnc.get()); } catch (Exception e){ e.printStackTrace(); } } } /** * @see http://docs.oracle.com/javase/jp/7/api/java/util/concurrent/RecursiveTask.html */ class Fibonacci extends RecursiveTask<Integer> { final int n; public Fibonacci(int n) { System.out.println(this.toString()); this.n = n; } @Override protected Integer compute() { if (n <= 1) { return n; } Fibonacci f1 = new Fibonacci(n - 1); f1.fork(); Fibonacci f2 = new Fibonacci(n - 2); return f2.compute() + f1.join(); } }
結果
info.typea.javase7.nio.Fibonacci@6ab41dbb info.typea.javase7.nio.Fibonacci@570c16b7 info.typea.javase7.nio.Fibonacci@22fdffb1 : info.typea.javase7.nio.Fibonacci@519dcf69 info.typea.javase7.nio.Fibonacci@4f9c205b info.typea.javase7.nio.Fibonacci@13105f32 RESULT:610
© 2006 矢木浩人