Java SE8 Gold (2)
Java SE 8 Gold 研修 2 日目のメモ. ここから難度が微妙に上がる…. NIO2が難しい….後日ブラッシュアップ更新します….
- ラムダ式続き
- ジェネリクスとコレクション
- 例外
- Java I/O (基本)
- Java ファイル I/O (NIO.2)
ラムダ式続き
Stream API
過去記事参照
ジェネリクスとコレクション
ジェネリクス
- コードに対する柔軟な型の安全性の提供
- 実行時に発生する多くの一般的なエラーをコンパイル時に確認可能
- 整理された記述しやすいコードの提供
- コレクションでのキャストの必要性が低くなる
- Java Collections API で頻繁に使用される
任意の識別子(慣例)
- T : 型
- E : 要素
- K : キー
- V : 値
- S, U : 2 つ目,3 つ目またはそれ以降の型に使用
型推論ダイアモンドが使用されたジェネリクス
List<T> list = new ArrayList<>();
- ジェネリクスの宣言の簡易化
- 入力の手間を省ける
コレクション
オブジェクトのグループを管理するために設計されたシングルオブジェクト コレクションにプリミティブ型を含めることはできない 様々なコレクション型により,多くの一般的なデータ構造が実装(Stack, Queue, 動的配列, Hash)
自動ボクシング及びアンボクシング
プリミティブ型とその Wrapper クラス(ex. int ⇄ Integer)を移動する時, 自動ボクシング及びアンボクシングが行われており, 正式なキャスト構文を使用されずに適切な割り当てを行うことができる. 但し,その分内部で処理が発生するためオーバーヘッドが生じることに注意.
コレクション型
List≪interface≫
重複可能.順序付けられている.
Set≪interface≫
重複不可.順序付けられていない.
- TreeSet : 内部ではソートされている.
Map≪interface≫
複数のキー/値のペアを保存する.連想配列.
- TreeMap : キーが自動的にソートされる
- HashMap : null キー及び null 値を受け入れる.同期されない.
Queue
- Deque : double ended queue(両端キュー)の略.Queue の拡張 キュー(FIFO)やスタック(FILO)のような動作を実現できる interface FIFO の場合:add()や offer(),remove()や poll(),element()など FILO の場合:push(),pop(),peek()
実装はArrayDeque
クラスやLinkedList
クラスがある.
Comparable≪interface≫ と Comparator≪interface≫
Comparable
インスタンスの前後関係の判定のためにそのクラス自身に実装
Comparable の compareTo メソッド : int compareTo(T parameter) ソート順が自インスタンスが前,parameter が後になる場合: compareTo メソッドで負の値を返すように実装 ソート順が parameter が前,自インスタンスが後になる場合: compareTo メソッドで正の値を返すように実装
String の compareTo メソッド : int (StringObj s1).compareTo(String s2) ソート順として,s1 が前に,s2 が後になる場合:負の値を返す ソート順として,s2 が前に,s1 が後になる場合:正の値を返す ソート順として,s1 が s2 が同じ場合:0 を返す
Comparator
インスタンスをソートするためのロジックを構成するクラスで実装
Comparator の compare メソッド : int compare(T p1, T p2) ソート順が p1 が前,p2 が後になる場合: compare メソッドで負の値を返すように実装 ソート順が p2 が前,p1 が後になる場合: compare メソッドで正の値を返すように実装
例外
例外処理
例外発生時にtry-catch文
を使用して制御を例外処理ブロックに移すこと
例外宣言
throws句
をメソッドの宣言に追加し,
メソッドを特定の方法で実行できない可能性があることを示す.
別のユーザが対処する必要がある.
throw 文
例外を発生させる文(例外オブジェクトを新規に生成する)
throws 句
メソッド定義に付加する句
例外ロギング
printStackTrace()
スタック・トレース
getMessage()
例外メッセージの取得
チェック例外と非チェック例外
チェック例外
- 特定の Java コードにおいて,発生し得ることがコンパイル段階でチェックされる例外
- try-catch 句や throws 句の記述が必須
- IOException, FileNotFoundException, SQLException
非チェック例外
- 特定の Java コードにおいて,発生し得ることがコンパイル段階でチェックされない例外
- try-catch 句や throws 句の記述が必須ではない
- NumberFormatException,ArrayIndexOutOfBoundsExceptionなど
java.lang.Throwable クラス
finally 句
try ブロック実行中でエラーが発生したかどうか関係なく,常に実行される. ファイルや DB 接続などのリソースを開いていて, それらが必要なくなったら常にクローズする必要がある時によく使われる
try-with-resources 句
Java SE 7 から導入.
- 1 つ以上のリソースを宣言する try 文
- java.lang.AutoCloseable を実装する全てのクラスをリソースして使用可能 ファイル IO 系(NIO),DB アクセス系(JDBC)など
- 冗長な finally ブロックが不要になる
try(InputStream in = new FileInputStream("missingFile.txt")){ System.out.println("File Open"); int data = in.read(); } catch (FileNotFoundException e){ System.out.println(e.getMessage()); } catch (IOException e){ System.out.println(e.getMessage()); }
multi-catch 句
Java SE 7 から導入
- 単一の catch ブロックで 1 つ以上の型を例外処理できる
try(InputStream in = new FileInputStream("missingFile.txt")){ System.out.println("File Open"); int data = in.read(); // 複数の例外型は縦線で区切る } catch (ClassNotFoundException | IOException e){ System.out.println(e.getMessage()); }
- 縦線で区切られている例外型は継承関係にない必要がある. つまり,FileNotFoundException と IOException の両方は指定できない
Java I/O (基本)
I/O ストリーム
ファイルの読取及び書込,キーボード(標準入力)とコンソール(標準出力)などの出力デバイスに対する情報の読取及びを行う.
java.io.FileInputStreamjava.io.FileOutputStream java.io.DataInputStreamjava.io.DataOutputStream
バイト・ストリームの InputStream メソッド
read()
close()
開いているストリームを閉じる
available()
使用できるバイト数
skip()
ストリームから n バイト破棄
バイト・ストリームの OutputStream メソッド
write()
close()
try-with-resources で自動的に閉じられる
flash()
ストリームへの書込みを強制
キャラクター・ストリームの Reader メソッド
read()
close()
ready()
skip()
markSupported()
mark()
reset()
キャラクター・ストリームの Writer メソッド
write()
close()
flash()
I/O ストリームの連鎖
入力ストリームの連鎖
出力ストリームの連鎖
シリアライゼーション(直列化)
- シリアライズ : JVM ヒープ・メモリ内にあるオブジェクトを ディスクなど外部に出力する(永続化)ためのフォーマット変換
- java.io.Serializable インタフェースを実装しているクラスのオブジェクトはシリアライズ可能
transient
修飾子を指定すればシリアライズ対象にならない
Java ファイル I/O (NIO.2)
Java SE 7 から導入
java.nio.file.Path
オブジェクトのインスタンスを使用して
ファイルまたはディレクトリの相対的または絶対的位置を表す.
パスは絶対パスあるいは相対パスを指定する.
NIO2 はラムダ式と Stream API と組み合わせて IO 処理を楽にしている
java.nio.file.Path
システム依存パスを使用して,ファイルまたはディレクトリを検索する
java.nio.file.Files(ファイル操作)
ファイルおよびディレクトリに対する操作を実行する
確認
exists()
notExists()
作成
createFile()
createDirectory()
削除
delete()
コピー
copy(sourcePath, targetPath, CopyOption...)
REPLACE_EXISTING COPY_ATTRIBUTES NOFOLLOW_LINKS
移動
move(sourccePath, targetPath, CopyOption...)
ディレクトリの内容の一覧表示
Files.list()
戻り値はStream 型であることに注意
ディレクトリ構造の探索
Files.walk()
戻り値はStream 型であることに注意
BufferedReader ファイル・ストリーム
lines()
BufferedReader をストリームに変換する
NIO ファイル・ストリーム
lines()
ArrayList へのファイル読込
readAllLines()
ファイルを ArrayList にロードする.