Java Doc 読解〜System.out〜

イントロダクション

標準入力に関してやったので、今度は標準出力に関してやります。

上記のキャプチャ「out」が標準出力になります。
でもこれは。。。

標準出力

一番初めのプログラムでこのクラスを使用しています。
コンソール出力がこの「標準出力」にあたります。

public static void main(String[] args) {
   System.out.println("Hello World");
}

以上です。

でわでわ。。。


Java Doc読解 〜System.In〜

イントロダクション

標準入力、画面からの入力にはWebのフォームが一番身近に感じる人が多いのではないでしょうか?フォームの出てくる、もっと昔からコンソール入力があるんです。その入力のことを「標準入力」と呼びます。

そして、Systemクラスのフィールドにいます。(実態はInputStreamクラスです)
JavaDocAPIはこちら

標準入力の実装

四の五の言わずにサンプルコードを下に示します。

System.out.println("test1 入力開始");
// 配列は動的に扱うときに大変だ。。。
byte[] moji = new byte[5];
try {
   System.in.read(moji);
} catch(Exception e) {
   e.printStackTrace();
}
System.out.println("入力じた文字:" + new String(moji));

byte配列を用意(宣言した時にメモリの領域が確保されます)、サンプルコードでは5バイト分を用意しています。標準入力を受けて入力した文字を表示します。

シンプルですね(笑)
メインメソッドからちゃんと作成したものはGitにアップしております。

こんな感じです。
でわでわ。。。

Java Doc 読解〜BufferedWriter〜

イントロダクション

BufferedWiterはReaderインターフェースとセットにして使用することが多いです。ちなみにBufferedReaderに関してはこちらです。

JavaDocの読み込み

キャプチャを撮ってみました。ぶっちゃけた話細かいことより「どうつかうの?」が知りたいと思っているところに詳細なクラス関係などを説明されても困るので、筆者は困ったので、早速使い方を以下に示します。

// TODO-[IOExceptionのthrows文、try〜chatchなどを使用します。
FileReader fileRead = new FileReader(new File("./test.txt"));
BufferedReader read = new BufferedReader(fileReader);
BufferedWriter writer = new BufferedWriter(
                           new FileWriter(new File("./out.txt)));
// 読み込む行
String line = null;
while((line = read.readLine()) != null) {
   witer.write(line);
}
// ファイルを閉じる
writer.close();

Readerクラスの記載にも同じコードがあります。
FileReaderでも、通常の文字列でも良いのでwriteメソッドでファイルに出力します。そして、出力が終わったらcloase()してください。ファイルが閉じていない状態だと、対象のファイルが読めなかったり、余計なデーモン閣下が残ったりとして面倒臭いです。
※デーモン閣下→デーモン(デーモン・プロセス)画面上に表示されないけれど画面の裏側にいきているプロセスのことを言います。サーバなど起動しているときサーバーは画面上に出て来ず、裏側で起動している場合があります。この様なプロセスのことをデーモン(デーモン・プロセス)と呼びます。

Readerと合わせて使用することが多いです。他にも標準入力から使用することもあります。※ゲームを作成しようとしたら標準入力は必須になります。

でわでわ。。。


Java Doc読解 BufferedReader

イントロダクション

Java Docの内容を読んで、理解します。今回はBufferedReaderを理解します。

JavaDoc~BufferedReader~

読み込み

これは、自分のやり方ですが…

初めに「すべての実装されたインターフェース」を見ます。知っているものがあれば、理解は早いです。メソッドの使い方は全く同じになるので…

次は、クラスの説明部分を読みます。ここまで、上から順に読んでいます。

コンストラクタや、メソッドに関してはナナメ読みして使えそうなものをチョイスします。

Java Docのポイント

結局のところは、使えれば良い(処理の中身は必要に応じて)ので用途を理解できるようになれば、おっけ

Java Docの理解には、以下の事を分かっておくと楽です。

継承関係について(オブジェクト指向)の理解

対象クラスのベースになるフレームワークの理解、これはリストやマップであれば、コレクションフレームワークになるし、JavaFXであればJavaFXのフレームワークになります。

今回のお題

BufferedReaderの使用サンプルを下に示します。

// リーダー作成
Reader reader = new InputStreamReader(System.in);
// コンストラクタ
BufferedReader buf = new Bufferedreader(reader);

こんな感じです。ちなみにファイルの読み込みを行うときは

// TODO-[IOExceptionのthrows文、try〜chatchなどを使用します。
FileReader fileRead = new FileReader(new File("./test.txt"));
BufferedReader read = new BufferedReader(fileReader);
BufferedWriter writer = new BufferedWriter(
                           new FileWriter(new File("./out.txt)));
// 読み込む行
String line = null;
while((line = read.readLine()) != null) {
   witer.write(line);
}
// ファイルを閉じる
writer.close();

Readerクラスを継承したクラスがJava Docに記載されているのでどれを選んでもおっけーです。ちなみにBufferedWriterに関しても記載しております。

既知のサブクラスに記載されてます。

関連するインターフェースなど

そして、対象のクラスの継承関係(親子関係)

早い話が、Readerクラスを親に持っていますよ。ということ

BufferedReaderと似たクラスは何かな?と思ったら親クラスのReaderクラスを参照してみれば良い。

以下のようなクラスが兄弟クラスとして見ることができます。
BufferedReader,
・ CharArrayReader,
FilterReader,
InputStreamReader,
PipedReader,
StringReader

こんな感じで開拓して行くのも面白いのではないでしょうか?

でわでわ。。。


Java Doc Classloader




ClassloaderのJavaDoc読解を行います。

昔(かれこれ5年くらい前)読んだ時より内容が変わっています。。。
NetWorkClassloaderについて記載があります。

まとめるとClassloaderはクラスをロードするクラスで
そのためのメソッド群が用意されています。

抽象クラスなので、new Classloader()の様には使えません。
JavaDocで「修飾子と型」の列にprotectedと記載している
メソッドも使用できません。
※このクラスを拡張するときに使用できます。

/** クラスを拡張する */
public ExpandClassloader extends Classloader {
    // 何かの処理
}

拡張しないで使用するのは、以下のメソッドくらいかな?
getResourceAsStream(String name)
getSystemResource(String name)
loadClass(String name)

サンプルコードはこちらです。

JavaDoc 読解 〜 Filesクラス 〜

昔は、FileReader, FileInputStreamを使用してやっていました。
今でも使用できますが、java.nio.files.Filesを使用する方法が
スタンダードになってきたかな?という感じです。

記述する内容は、昔よりも格段に減りました。

// FILEのパス
Path filePath = Paths.get(FILE_PATH);
List<String> lines = Files.readAllLines(filePath);

こんな感じで処理が実現します。
ちょっと省略してますが。。。

まぁ細かいところはこちらのソースをご覧ください。
ダウンロードして実行できるはずです。
※Macで作成しているためビルドパストか違っています。
ソースのみを取得して実行することをオススメします。
MacでEclipseを使用している人はプロジェクトごとPullして
おっけーです。

ちなみに、ファイルの読み込みなどを行うときに
「パスの指定」で結構つまづきます。
ルートになるパスがプロジェクトのディレクトリになるのですが

頭に「/」がついたりつかなかったりと。。。
とりあえず、「パスの使い方サンプル」を実装しました。

System.out.println("*** Paths Testing ***");
Path path = Paths.get("resources", "title.txt");
// 標準出力
path.forEach(System.out::println);
System.out.println("*** read File ***");
try {
   List<String> list = Files.readAllLines(path, Charset.defaultCharset());
   list.forEach(System.out::println);
} catch(IOException e) {
   e.printStackTrace();
}
  1. Paths.get(ファイルへのあるフォルダまでのパス, ファイル名);
    呼び出しはクラス名.メソッド名の様に呼びます(staticメソッドの呼び出し)
    の様に引数に値を設定します。 ファイルは以下にあります
    「project/resource/title.txt」
  2. 取得した「Path(Pathsとは別のクラスです)」からforEachメソッドを使用して
    System.out.printlnメソッドを渡しています。
    これはラムダ式の書き方でループで取得したpathの中身を上記のメソッドに渡す
    という処理になります
  3. ListでのforEach()です。これも上記と同様です。
    ラムダ式の書き方でclazz.xxx(
    コレクション内の要素変数(名前は自由) -> メソッドなどの処理);
    の様に記載します。
    サンプル、パターン1と2は同じ動きをします。

    // Pattern1
    xxxx.forEach(str -> method(str));
    // Pattern2
    xxxx.forEach(Class::method);

     



Java Doc 読解 Map



インタフェースMap<K,V>

Java Docの解釈を行います。
「既知のすべての実装クラス:」と書いてある部分は
javaAPIで提供されているクラスです。
→java.util.Mapをインポートすればおっけ

例:import java.util.Map
実装のサンプルはこちら

Mapの実装クラス(インターフェースでない)は
サンプルコードではHashMapとPropertiesを記載しています。

Mapは「put」メソッドで値をセット
「get」メソッドで値を取得します。

PropertiesはMapと違う部分がありますが
概ね一緒です、細かいところはサンプルコードをみてください

Mapはキーと値をセットにしているので
「contains」メソッドで値の有無をチェックしたり
Listクラスの様に「forEach」でループしたりと色々できます。

リストと並び使用頻度の高いクラスです。

他にもTreeMapなどがあり、ソート(並び替え)などできます。

並び替えはまた後日・・・

Java Doc 読解 System



java.lang.SystemクラスのJavaDoc 読解です。JDK ver1.8

【使い方】
「new」しないで使用します。
System.メソッド名(フィールド名)の様に使用します。

実行サンプルコードはこちらです。

それぞれ
out: PrintStram(InputStream)の新しい(ラップした)ものです。(標準出力)
err: 「out」に同じ
in: InputStream(標準入力)

例:毎度おなじみ標準出力(コンソール出力)

System.out.println("文字列を記述");

Systemクラスのフィールド「out」を呼び出しさらに「println」メソッドを呼びます。これは改行が含まれます。

System.out.print("文字列を記述");

上記と同様です。ただし、改行が含まれません。

Systemクラスには標準入力に「in」があります。

例1:一番レベルが低い状態(他のクラスでラップしない)

byte[] input = new byte[3]; // 3文字の入力を受け付ける(全角は1文字)

System.in.real(input, 0, 2); // 3文字文の領域しか用意していない

【メソッド読解】
このクラスでは全てが「static」メソッドです。
equalsなどは「Object」(親)クラスのメソッドです。

  1. arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
    src: コピー元の配列を設定する
    srcPos; コピーを開始する位置を指定
    dest: コピー先の配列
    destPos: コピー先配列の開始位置
    length: コピーする数
  2. 以下は、システム・レベルで扱うプロパティなのでいじらない方が良いかも?
    clearProperty(String key)
    setProperty(String key, String value)
  3. その他、よく使うのものをピックアップしました。
    exit(int status): 起動しているJavaアプリケーションを終了します。
    ※この処理が走ると強制的に終了します。
    gc(): ガベージコレクション(もう使用していないオブジェクト)を解放します。
    ※メモリの解放を行います。細かいことは後々。。。
    そして、下のコードと同じ意味です。

    Runtime.getRuntime().gc()
  4. getenv():環境変数などの値が入っているMapが返されます。



Java Doc 読解 List 〜java.util.List その1〜

Java Docの読解

コレクションフレームワークのスーパーインターフェースにあるCollectionは
Collections Frameworkの根っこになるものです。

一言でループ処理が楽になる
メソッドがあると思ってもらえばおっけ。
Iteratableは「forEach」メソッドを提供します。
(使える様にするという意味)

List<E>のEはエレメント(要素)

を示し、ジェネリクスと呼びます。
リストなどを使用する時は大体これがもれなく付いてきます。

// ArrayListをListとして使用します。
List<String> list = new ArrayList<>();
// LinkedListをListとして使用します。
List<String> list = new LinkedList<>();
// VectorをListとして使用します。
List<String> list = new Vector<>();

上記の様に使用します。

用途としては、リストに登録した値をソート(並び替え)、指定したものの取得、リスト内にあるかチェックするなど

色々とあるので探してみるのも一興です。
百聞は一見にしかずです。ソースはこちらです。
Gitからダウンロードできます。

類似品にセット(Set)があります

toArray()はList→配列(T[])の形へ変換する

サンプルコードです。

ArrayList<TestA> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
   list.add(new TestA());
}
TestA[] items = new TestA[list.size];
items = list.toArray(items);

これで対象の型(クラス)を安全に取り出すことができます。

昔のやり方だとキャストしていましたので、コードとして美しくないし、ClassClastExceptionに対する注意が必要(安全な型変換ではない)なのでイマイチなコードでしたが、最近ではこのような方法があるのでGoodですね。

<イマイチなコード>

ArrayList<TestA> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
 list.add(new TestA());
}
// キャストしているので安全ではない
items = (TestA[]) list.toArray();

リストの主な機能

リストへの要素追加、削除、検査
ラムダ式オブジェクト取得

そのほかにもありますが、今回はここまでにします。