2009年3月19日木曜日

for-each

java5以降
 for( 型 変数名: コレクション)
 コレクション: 配列、iteratableを実装したコレクションクラス
[例]
for(String str: arrStr)
for(Iterator: xxx.iterator())

コンソールエンコード

実行時のEncoding
実行の構成-共通-コンソール・エンコードで指定

文字ストリーム

Reader、Writer(抽象クラス)
 BufferedReader、BufferdWriter
 InputStreamReader、OutputStreamWriter
  FileReader、FileWriter

バッファリングなしでファイルからの入力
 FileReader
  ファイル名、Fileオブジェクトから作成
バッファリングありでファイルからの入力
 FileReader→BufferedReader
  Readerオブジェクトから作成
  行単位でread可能(改行コード line.separatorプロパティの定義)
サービス機能つきでファイルからの入力
 FileInputStream→InputStreamReader(→BufferedReader)
  InputStreamオブジェクトから作成
  エンコード指定可能(Charsetオブジェクトで指定)
 Scanner(Java5以降)
  FileオブジェクトやInputStream、Readableオブジェクトから作成
  構文解析が可能

バッファリングなしでファイルへの出力
 FileWriter
  ファイル名、Fileオブジェクトから作成
バッファリングありでファイルへの出力
 FileWriter→BufferedWriter
  Writerオブジェクトから作成
  newLineメソッドでシステム依存の改行出力可能(line.separatorプロパティの定義) 
サービス機能つきでファイルへの出力
 FileOutputStream→OutputStreamWriter(→BufferedWriter)
  OutputStreamから作成
  エンコード指定可能
 PrintWriter
  OutputStream、Writerオブジェクトから作成
  print、printf、printlnメソッドあり
  printlnメソッドでシステム依存の改行出力可能(line.separatorプロパティの定義) 
  プリミティブ型をフォーマットして出力可能
  

2009年3月6日金曜日

java.io.Fileクラス

  • カレントディレクトリの取得
    new File(".").getAbsoluteFile().getParent()
    getParent:パス名文字列を取得
    getParentFIle:Fileオブジェクトを取得
  • コンストラクタ
    File(File parent, String child)
    親抽象パス名および子パス名文字列から新しい File のインスタンスを生成します。
    File(String pathname)
    指定されたパス名文字列を抽象パス名に変換して、新しい File のインスタンスを生成します。
    File(String parent, String child)
    親パス名文字列および子パス名文字列から新しい File のインスタンスを生成します。
    File(URI uri)
    指定された file: URI を抽象パス名に変換して、新しい File のインスタンスを生成します。

2009年2月5日木曜日

入出力(Stream、Reader、Writer)

StreamReader/Writer
  • 用途によって、さまざまなクラスが存在する
  • 基本的なクラスを順に特化したクラスに渡していく感じ
    System.in→InputStreamReader→BufferdReader
    File→FileReader
    File→FileOutputStream→DataOutputStream
    File→FileInputStream→BufferedInputStream→DataInputStream
  • どのような用途でどのクラスを使うのかはまだよくわからない
    ※コンストラクタによる違い
     FileInput/OutputStream: ファイル名(String)かFileオブジェクトから作成可能
     DataInput/OutputStream: Input/OutputStreamから作成可能
     BufferdInput/OutputStream: Input/OutputStreamから作成可能
     →ファイル名(String)かFileオブジェクトからFileInput/OutputStreamを作成
      →FileInput/OutputStreamからBufferdInput/OutputStreamを作成
        ※バッファリングが必要な場合のみ
       →BufferdInput/OutputStreamからDataInput/OutputStreamを作成
  • BufferなしReader
    1文字づつのreadではintで受ける
    データ終了は-1、内部データは16bit Unicode
    取得文字表示時はcharにキャスト

2009年1月29日木曜日

符号付き整数の型変換

bytes→int

  • 符号付きで格納(-128~127)
    そのまま代入する

  • 0~255として変換
    0x000000FFとbitAND演算する

Stringとバイト配列


  • バイト配列から文字セットを指定して文字列を作成
    public String(byte[] bytes, String charsetName)
    String s = new String(bs, "US_ASCII");
    ※マルチバイト文字列の場合作成されたStringは内部形式(Unicode?)
     EUC-JP形式のbyte配列から作成した文字列
     Windows-31J形式nobytes配列から作成した文字列
     両者は同じStringとなる

  • 文字列から文字セットを指定してバイト配列作成
    String s = "ABC";
    bytes[] bs = s.getBytes("US-ASCII");

NumberFormatクラス

数値のフォーマット処理
DecimalFormatを利用するパターン
NumberFormat nf = new DecimalFormat("000");
String s = nf.format(99);

2009年1月22日木曜日

数値の変換


  • Doubleラッパークラス
    doubleToLongBits(double)
     //IEEE 754 浮動小数点のビットレイアウトに従ったlong値
    valueOf(string)
     //構文解析し、Doubleオブジェクトを返す
    parseLong(string)
     //構文解析し、double値を返す

  • Longラッパークラス
    longValue()
     //Longオブジェクト の値を long として返す
    toBinaryString(Long)
     //基数 2 の符号なし整数として返す
    valueOf(string,int)
     //2 番目の引数で指定された基数を使用した構文解析し、Longオブジェクトを返す
    parseLong(string,int)
     //2 番目の引数で指定された基数を使用した構文解析し、long値を返す

符号付整数での負数の表現


  • 2の補数をとる
    正数の全bit反転して+1する

  • 減算の計算
    負数を加算している(最上位の桁上がりは破棄)

2009年1月21日水曜日

インスタンス生成時のエラー処理

コンストラクタではエラーコードを返すような実装はできない
→インスタンス生成時のエラー発生を捕捉するには例外は必須

2009年1月19日月曜日

java.util.Scannerクラス

J2SE 5.0以降で対応
正規表現を使用した構文解析ができるテキストスキャナ
ファイルや入力ストリームから読み込みができる

2009年1月16日金曜日

mainからの例外

main に throws付与で例外を投げてもよい
try、catch節不要

テストプログラムなどでは便利かも。

標準入力からの読み取り

1行読み取り
 System.in
 →java.io.InputStreamBuffer
  →java.io.BufferedReader

BufferedReader.readLine();

※使用後はclose()

イベントディスパッチスレッド

コンポーネントの「状態に依存する」あるいは「状態に影響を与える」処理はすべてイベントディスパッチスレッド上で動作しなければならない

SwingUtilities.invokeLater(Runnable obj);
Runnableobjのrunメソッドをイベントディスパッチスレッドで非同期的に実行させる

他のスレッドでコンポーネントを変更する場合
スレッドからinvokeLaterを呼び出し、変更処理をイベントディスパッチスレッドで実行させる
※別スレッドからの直接変更もできるが、悪影響があるのかも?
※mainからのコンポーネント作成/表示も同様にイベントディスパッチスレッドで実行させる?(sampleはそうしている)

2009年1月15日木曜日

JList基本

  • JList
    コントロール
  • ListaDataModel
    リストデータ
  • ListDataLister
    リストデータとコントロールの同期
ListDataModel objを作成
ListDataModel objのaddListDataListenerでListenerをセット?
ListDataModel objを渡してJList objを作成
ListDataModelとしてDefaultListModelを使用する場合、Listenerの明示的セットは不要
(内部で自動作成している?)

SWING基本

  • トップレベルコンテナ
    JFrame
     setDefaultCloseOperation
    setSize
    setVisibleで表示
  • 中間コンテナ
    JPanel、Container
     JFrameオブジェクト.getContentPaneで取得
  • コントロール
    JButton、JLabelなど
    中間コンテナにaddする
  • イベント
    ActionListenerをimplementしたクラスを準備
    コントロールobjのaddActionListeneメソッドで上記objをListenerとしてセット
    ListerクラスのactionPerformedメソッドでイベントハンドらを記述

2009年1月9日金曜日

テキストエリア

JTestField 1行
JTextArea 複数行
(スクロールバーつきはJScrollPaneに格納)

代表的パッケージ

  • java.awt
    Abstract Window Toolkit。GUIアプリケーション作成時に使います
  • java.io
    データストリーム、ファイルシステムなどによるシステム入出力用クラスが含まれています
  • java.lang
    基本クラス。ここに含まれるクラスはパッケージ名を省略して使うことができます
  • java.net
    ネットワーク対応アプリケーション作成時に使います
  • java.util
    プログラムを作成するに当たって便利なコレクションフレームワークやユーティリティクラスが含まれています。例えば、日時機能、乱数ジェネレーターなどがあります

インターフェイスの実装

  1. 新規クラス作成
  2. インターフェイス追加でインターフェイス選択画面
  3. 「インターフェイスを選択してください」
     インターフェイス名をエディットBOXに直接入力すると
     一致する項目一覧に該当するインターフェイスが表示される
     一致する項目一覧から選択して追加(連続で追加可能)
  4. OKでインターフェイス選択画面閉じる
  5. インターフェイス一覧に選択したインターフェイスが表示されている

コレクションフレームワーク

  • Generic機能(J2SE5.0以降)
    ArrayList のようにコレクションで扱う型を特定する
    get時等のキャストが不要
     旧:s = (String)list.get(i);
     新:s = list.get(i);
  • オートボクシング機能(J2SE5.0以降)
    基本型とラッパークラス型間のデータ変換を自動実行してくれる
    基本ラッパー型のコレクションでもデータ変換不要
     旧:ary.add( new Integer(100) );
       i = ary.get(i).intValue();
     新:ary.add( 100 );
       i = ary.get(i);