Java」カテゴリーアーカイブ

ファイルの読込み:テキストファイル

テキストファイルを読み込む方法です.
 
基本的にファイルは入力ストリームなので,内容は先頭から順番に読み込まれます.
ここでは次の3つの方法を順番に説明します.

1) ファイルから「1バイトづつ」読み込む方法
2) ファイルから「1文字(多国語含む)づつ」読み込む方法
3) ファイルから「1行づつ」読み込む方法
 
次ような内容のファイル “text1.txt” があるものとして,この内容を読み込む方法を説明します.
 

Alphabet
日本語
English and 日本語 混在

 

【ファイルから「1バイトづつ」読み込む方法】

 ファイルを FileInputStream として開き,それに対して read() メソッドを実行すると1バイトづつ読み込むことができます.読み取ったデータは int 型整数として与えられます.(下記:”FileRead1.java”)

import java.io.*;

class FileRead1 {
	public static void main( String argv[] ) {

		FileInputStream fi;
		int c, i = 0;

		try {
			fi = new FileInputStream("text1.txt");
			while ( (c = fi.read()) != -1 ) {
				i++;
				System.out.println( i+":"+(char)c );
			}
			fi.close();
		} catch( IOException e ) {
			System.out.println("ファイルがオープンできません\n");
			System.exit(-1);
		}
	}
}

 この方法は最も基本的ですが,1バイトづつ読むため能率がよくありません.また多バイトからなる多国語文字を認識しないため実行すると文字化けが起こります.実行結果の表示を下に示します. 

1:A
2:l
3:p
4:h
5:a
6:b
7:e
8:t
9:

10:æ
11:—
12:¥
13:æ
14:œ
15:¬
16:è
17:ª
18:ž
19:

20:E
21:n
22:g
23:l
24:i
25:s
26:h
27: 
28:a
29:n
30:d
31: 
32:æ
33:—
34:¥
35:æ
36:œ
37:¬
38:è
39:ª
40:ž
41:ã
42:€
43:€
44:æ
45:·
46:·
47:å
48:œ
49:¨
50:

 

【ファイルから「1文字(多国語含む)づつ」読み込む方法】

 入力するデータを「文字データ」として認識して1文字づつ読み取る方法です.ファイルを FileInputStream として開き,更にそれを元にして InputStreamReader というオブジェクトを生成し,それに対して read() メソッドを実行すると「1文字づつ」読み込むことができます.読み取ったデータは int 型整数として与えられます.(下記:”FileRead2.java”)

import java.io.*;

class FileRead2 {
	public static void main( String argv[] ) {

		FileInputStream fi;
		InputStreamReader isr;
		int c, i = 0;

		try {
			fi = new FileInputStream("text1.txt");
			isr = new InputStreamReader(fi,"UTF-8");
			while ( (c = isr.read()) != -1 ) {
				i++;
				System.out.println( i+":"+(char)c );
			}
			fi.close();
		} catch( IOException e ) {
			System.out.println("ファイルがオープンできません\n");
			System.exit(-1);
		}
	}
}

 この方法では多バイトからなる多国語文字を認識するため,文字化けは起こりません.実行結果の表示を下に示します.

1:A
2:l
3:p
4:h
5:a
6:b
7:e
8:t
9:

10:日
11:本
12:語
13:

14:E
15:n
16:g
17:l
18:i
19:s
20:h
21: 
22:a
23:n
24:d
25: 
26:日
27:本
28:語
29: 
30:混
31:在
32:

 また,ファイルを FileReader として開いてそれに対して read() メソッドを実行する方法(下記;”FileRead3.java”)もあり,同じ結果を得ることができます.

import java.io.*;

class FileRead3 {
	public static void main( String argv[] ) {

		FileReader fr;
		int c, i = 0;

		try {
			fr = new FileReader("text1.txt");
			while ( (c = fr.read()) != -1 ) {
				i++;
				System.out.println( i+":"+(char)c );
			}
			fr.close();
		} catch( IOException e ) {
			System.out.println("ファイルがオープンできません\n");
			System.exit(-1);
		}
	}
}

 

【ファイルから「1行づつ」読み込む方法】

 おそらく一番実用的な方法かと思います.テキストファイルを「1行づつ」読み取って String クラスの文字列オブジェクトとして取り出す方法です.(下記:”FileRead4.java”)

import java.io.*;

class FileRead4 {
	public static void main( String argv[] ) {

		FileReader fr;
		int i = 0;
		String b;

		try {
			fr = new FileReader("text1.txt");
			BufferedReader br = new BufferedReader(fr);
			while ( (b = br.readLine()) != null ) {
				i++;
				System.out.println( i+":"+b );
			}
			fr.close();
		} catch( IOException e ) {
			System.out.println("ファイルがオープンできません\n");
			System.exit(-1);
		}
	}
}

 これを実行すると次のようになります.

1:Alphabet
2:日本語
3:English and 日本語 混在

 

【コンマ区切りの文字列(CSVデータ)の分離】

 コンマ区切りデータ(CSVデータ)を1行づつ読み取った場合に,その行をコンマ毎に区切ってバラバラの文字列にする方法を説明します.今回例に使用するのは,総務省が配布する「標準地域コード」です.このデータは次のように8つの項目からなり,それをCSVデータにしたファイル “ChiikiCode.csv” を読み込む例です.
 1. 都道府県コード
 2. 市町村コード
 3. 地域コード
 4. 都道府県名
 5. 市町村名1
 6. 市町村名2
 7. 市町村名3
 8. 読みがな
このファイルの内容は次のようなものです.

1,0,1000,北海道,,,,ほっかいどう
1,100,1100,北海道,札幌市,,,さっぽろし
1,101,1101,北海道,札幌市,,中央区,ちゅうおうく
1,102,1102,北海道,札幌市,,北区,きたく
  (以下省略)

このデータを読み取って,3〜8の項目を表示するプログラム “CSVtest1.java” を下に示します.

import java.io.*;

class CSVtest1 {
	public static void main( String argv[] ) {

		FileReader fr;
		int i = 0;
		String b;
		String csv[] = new String[20];

		try {
			fr = new FileReader("ChiikiCode.csv");
			BufferedReader br = new BufferedReader(fr);
			while ( (b = br.readLine()) != null ) {
				i++;
				csv = b.split(",");
				System.out.print("("+i+")");
				System.out.printf("\t地域コード: %s\n",csv[2]);
				System.out.printf("\t%s%s%s%s",csv[3],csv[4],csv[5],csv[6]);
				System.out.printf("(%s)\n",csv[7]);
			}
			fr.close();
		} catch( IOException e ) {
			System.out.println("ファイルがオープンできません\n");
			System.exit(-1);
		}
	}
}

このプログラムを実行した様子を下に示します.

(1)     地域コード: 1000
        北海道(ほっかいどう)
(2)     地域コード: 1100
        北海道札幌市(さっぽろし)
(3)     地域コード: 1101
        北海道札幌市中央区(ちゅうおうく)
(4)     地域コード: 1102
        北海道札幌市北区(きたく)
  (以下省略)

JavaFX GUIアプリ構築入門(NetBeans IDE)

マニュアルをまとめつつあります.)
 
 実用的なGUIアプリを構築するにはボタンやメニューを始めとする各種のコントロール(GUI部品)を多数使用しますが,それらを全て手作業でコーディング(プログラムのソースコードの手入力)するのはとても煩わしく,生産的ではありません.
 
 統合開発環境(IDE)と呼ばれるツールを用いることで直感的にGUIを構築することができ,それに対応するコースコードを自動的に生成することができます.ここでは NetBeans IDE というツールを用いて手軽にGUIアプリを構築する手順を紹介します.
 
NetBeans IDEはこのサイトからダウンロードできます.
 
またGUIを直感的に構築・編集するためには JavaFX SceneBuilder も入手してインストールしておく必要があります.(入手はこちら)
 

【プログラム作成手順】

 NetBeans IDEを起動して「ファイル」→「新規プロジェクト」を選びます.(下図参照)
NetBeans01
 次に,下のような表示になるので,「カテゴリ」から「JavaFX」を選択し,「プロジェクト」から「JavaFX FXMLアプリケーション」を選んで「次へ」ボタンをクリックします.
NetBeans02
 次に,下のような表示になるので,プロジェクト名やプロジェクトに関連するファイル群を保存する場所などを設定して「終了」ボタンをクリックします.
NetBeans03
 プロジェクトとはプログラム開発作業に関連するファイルや設定などをまとめたものだと考えてください.1つの開発単位は1つのプロジェクトとして1つのフォルダにまとめて保存されます.この例では “JavaFXMLApplication1” という名前のプロジェクトを作成しています.
 
 以上の作業で新規プロジェクトの作成が完了してプログラムの開発作業が可能になります.(下のような表示となります)
NetBeans04

プロジェクトを作成して開発準備が整うと最初の段階で次のようなファイル群が生成されます.

  1. mainメソッドを収めたアプリケーションの最上位のソースコード
     プロジェクト名と同じ名前のソースファイルが生成されます.上の例では “JavaFXMLApplication1.java” というソースファイルが生成されます.

  2. GUIを記述するFXMLファイル
     JavaFXではXML形式(FXML形式)でGUIを構築することができ,デフォルトでは “FXMLDocument.fxml” という名前のファイルが生成されます.

  3. GUIのイベントハンドリングのためのソースコード
     GUIからのイベントを受けて起動するメソッド群を記述するソースコードで,デフォルトでは “FXMLDocumentController.java” という名前のファイルが生成されます.

 
 プロジェクト生成直後は,サンプルとして1つのボタンのみを備えたGUIのアプリケーションのためのソースコードになっており,これを改造して独自のアプリケーションに仕上げていきます.
 
GUIの追加とイベントハンドリングの記述:
 NetBeans IDEの「プロジェクト」タブからFXMLファイルをダブルクリックすると JavaFX SceneBuilder が起動してGUIの編集が始まります.(下図)
SceneBuilder01
 
 例えばこのインターフェースにメニューバーを取り付け,「File」メニューの「Close」を選択するとプログラムが終了するようなアプリケーションに改造してみます.

  • ステップ1: メニューバーの取り付け
     SceneBuilderウィンドウの左端の「Control」の中から「MenuBar」を選び,これをGUIの上にドラッグ&ドロップするとメニューバーが設置できます.(下図)
    SceneBuilder03

  • ステップ2: メニューとメニュー項目の取り付け
     ウィンドウ左端の「Menu」から「Menu」や「MenuItem」を選んでメニューバーに取り付けていきます.この例では,予め登録されているメニュー項目「Close」があるので,取り付け作業の説明は省略します.

  • ステップ3: GUIへのイベントハンドリングの登録
     GUIのメニューバーを選択しておき,ウィンドウ左端の「Hierarchy」の中から「MenuItem Close」を選択します.次にウィンドウ右端の「Code : MenuItem」の中にある該当イベントの部分(この例では「OnAction」)に,そのイベントが起こったときに起動するメソッドの名前を入力します.この例では「Close」を選択したときに “QuitAction” というメソッドが起動するように設定しています.

  • ステップ4: ソースコードの追加
     ”FXMLDocumentController.java” の中に,イベントに対応して起動するメソッドを記述します.この例では「QuitAction」というメソッドの記述を追加しています.

 
 以上の作業で出来上がったコードを下に示します.
 
ソースコード “JavaFXMLApplication1.java”

package javafxmlapplication1;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class JavaFXMLApplication1 extends Application {
    
    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
        
        Scene scene = new Scene(root);
        
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
    
}

 
FXMLのコード “FXMLDocument.fxml”










    
        

 
イベントハンドリングのためのソースコード “FXMLDocumentController.java”

package javafxmlapplication1;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;

public class FXMLDocumentController implements Initializable {
    
    @FXML
    private Label label;
    
    @FXML
    private void handleButtonAction(ActionEvent event) {
        System.out.println("You clicked me!");
        label.setText("Hello World!");
    }
    
    @FXML
    private void QuitAction(ActionEvent event) {
        System.out.println("You Selected Quit from menu.");
        Platform.exit();
    }
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }    
    
}

 
 上のコードに追加したイベント用のメソッド「QuitAction」の中の Platform.exit(); という記述はアプリケーションの終了処理を行うものです.
 
注意: FXMLで構築したコントロール(GUI部品)はこのクラス内のオブジェクトとして宣言する必要があり,宣言文の直前にはアノテーション「@FXML」を記述する必要があります.
 

【プログラムの実行】

 作成したプログラムを実行するには,NetBeans IDEのメニュー「実行」から「プロジェクト…を実行」を選びます.(下図)
NetBeans05
するとプログラムがコンパイルされて実行されます.(下図)
NetBeans08
 

【アプリケーションのビルド】

 作成したプログラムを,単体で実行できるパッケージにビルドするには,NetBeans IDEのメニュー「実行」から「プロジェクト…をビルド」を選びます.(下図)
NetBeans09
 
この操作によって,ビルドされたパッケージが “.jar” という拡張子のついたファイルとして,プロジェクトフォルダ内の “dist” フォルダの中に生成されます.(下図)
NetBeans10
 
 このjarファイルはダブルクリックで実行を開始することができます.

——————————————————-
FXMLアプリケーション構築例(NetBeans IDE & Java FX Scene Builder)
 画像ビューワ(複数ウィンドウを持つアプリ)

JavaFX GUIアプリ構築入門

マニュアルをまとめつつあります.)
 
JavaFXによるGUIアプリ構築の入門です.

【基本1】
・ JavaFXアプリは Application クラスの拡張クラスとして作成する.
・ mainの中で launch メソッドを呼び出すことでGUIアプリが開始する.
・ launchメソッドは start メソッドを呼び出す.startメソッドの中で具体的にGUIを構築する.

サンプルプログラム:
 サンプルプログラム “JavaFXApplicationSample1.java” を次に示します.これは非常に単純なGUIアプリのサンプルで,「”Say ‘Hello World'”」ボタンをクリックすると “Hello World!” を標準出力(コマンド画面)に表示するだけです.

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class JavaFXApplicationSample1 extends Application {
    
    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler() {
            
            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
            }
        });
        
        StackPane root = new StackPane();
        root.getChildren().add(btn);
        
        Scene scene = new Scene(root, 300, 250);
        
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
    
}

これをコンパイルして実行した例を次に示します.
JavaFXApplicationSample1_exe
 
サンプル “JavaFXApplicationSample1.java” でのGUI構築の流れ:
 GUIのインスタンスは Pane (ペイン)と呼ばれる「台紙」のようなものの上に取り付けて行きます.Paneには特徴がそれぞれ異なる複数のクラスがあり,例のプログラムでは StackPane というクラスのインスタンス “root” を生成して,それをGUIの「台紙」にしています.また複数のPaneを階層構造で管理することができます.
 
 例のプログラムでは root に対して予め生成しておいたボタン “btn” を下位のオブジェクトとして登録して取り付けています.ボタンにイベントを登録するために setOnAction メソッドを使用しています.
 
 
————————————————————————-
【JavaFXアプリ構築の考え方】
 JavaFXアプリは Stage の上に構築される世界です.すなわち,Stage の上にウィンドウとなる Pane オブジェクトを配置して,それをアプリのGUIとします.

 Stage は Pane オブジェクト毎に設置します.すなわち,複数の Pane オブジェクトを用いる場合は,そのオブジェクト毎に Stage を生成し,それらを最初の Stage の配下に配置します.(initOwnerメソッドを使って Stage の上下関係を結びます)
 
Paneオブジェクトの配下に Controlls(GUI部品群)を配置する空間が Scene です.Scene オブジェクトは Pane オブジェクト毎に生成します.
 
あとは,Pane オブジェクトに必要なコントロール(GUI部品)群を登録します.
このようにしてGUI世界ができあがります.
 
このようなGUI構築作業を start メソッドの中に記述するわけです.
 
————————————————————————-
【特徴的な Pane】
● Accordion
Accordion
 
● ScrollPane
ScrollPane
 
● SplitPane(水平)
SplitPane_H
 
● SplitPane(垂直)
SplitPane_V
 
● TabPane
TabPane
 
 
——————————————————-
FXMLアプリケーション構築例(NetBeans IDE & Java FX Scene Builder)
 画像ビューワ(複数ウィンドウを持つアプリ)