SQLの窓

2013年09月25日


Java : Eclipse 実行の System.in.read(buff) でコンソール入力



Eclipse のコンソールで入力し、その内容で処理を行うと楽に処理のテストが可能です。画像の水色の部分が入力部分ですが、Enter で、改行コードを含めて入力されます( Windows で \r\n を確認しました )

通常のコマンドプロンプトとの違いは、Enter 後、カーソルが次の入力部分に移動しないところです。ですから、CTRL + END で自分で移動する必要があります。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;

import com.google.gson.Gson;

public class HttpAndGet {

	public static void main(String[] args) {

		// コマンドを入力する為の 128 バイトのバッファ
		byte[] line = new byte[128];
		// コマンド部分を抽出する文字列
		String command = "";
		int i_len = 0;
		// 終了コマンド
		while( !(command.toUpperCase().equals("Q")) ) {
			
			try {
				// プロンプト出力
				System.out.print("java>");
				// 入力( 改行付きで入力 )
				i_len = System.in.read(line);
			} catch (IOException e) {
				e.printStackTrace();
			}
			
			try {
				// 入力内容を文字列に変換して、入力文を取り出す
				command = (new String(line, "SJIS")).substring(0, i_len);
				// コマンドのみに変換
				command = command.trim();
				
			} catch (UnsupportedEncodingException e) {
				// TODO 自動生成された catch ブロック
				e.printStackTrace();
			}
			
			// コマンド処理( 大文字小文字を区別しない )
			if ( command.toUpperCase().equals("HTTPGET") ) {
				HttpGet();
			}
			// MS932 で判断
			if ( command.equals("強制終了") ) {
				System.out.print("強制終了します");
				System.exit(0);
			}
			
		}
		
		System.out.print("プログラムを終了しました");
		
	}

	// ******************************************************************
	// JSON を インターネットから取得する
	// ******************************************************************
	public static void HttpGet() {
		
		System.out.println("HttpGet を実行中です");
		
		String json_string = "";
		
		try {
			// JSON の URL
			URL url = new URL("http://toolbox.winofsql.jp/json/sample2.json");
			// 接続オブジェクト
			HttpURLConnection http = (HttpURLConnection)url.openConnection();
			http.setRequestMethod("GET");
			// 接続 
			http.connect();
			
			// http から InputStream を取得する
			InputStream i_stream = http.getInputStream();
			
			// InputStream から リーダを作成する( キャラクタセットを指定 )
			// UTF-8 でリーダーを作成( インターネット上のデータが UTF-8 なので )
			InputStreamReader i_stream_reader = new InputStreamReader(i_stream, "UTF-8");
			
			// リーダを行単位で読み込める BufferedReader を使って全ての文字列を取得する )
			BufferedReader buffer_reader = new BufferedReader(i_stream_reader);
			json_string = new TextReader().getText(buffer_reader); 
			
			// 全て閉じる
			buffer_reader.close();
			i_stream_reader.close();
			i_stream.close();
			http.disconnect();
			
		}
		catch( Exception e ) {
			e.printStackTrace();
			json_string = "{ \"winofsql\" : [\"error\"] }";
		}
		
		// Gson を作成
		Gson gson = new Gson();
		
		// 全体の文字列を JSON_ENTRY クラスに投入
		// ( 未定義のものは無視されます )
		JSON_ENTRY je = gson.fromJson(json_string,JSON_ENTRY.class);

		// 一覧表示
		for( int i = 0; i < je.winofsql.length; i++ ) {
			System.out.println(je.winofsql[i]);
		}
		
	}

	// ******************************************************************
	// BufferedReader から テキストを取得
	// ******************************************************************
	static class TextReader {
		public String getText(BufferedReader br) throws IOException {

			String result_string = "";
			String line_buffer = null;   
			// BufferedReader は、readLine が null を返すと読み込み終了   
			while ( null != (line_buffer = br.readLine() ) ) {   
				result_string += line_buffer;
			}
			
			return result_string;
		
		}
	}
	
	static class JSON_ENTRY {
		String[] winofsql;
	}

}

▲ このテストは、JSON の入力と Gson を使った デシリアライズです。

▲ のコードでは、バイナリで読み込んで、new String( buff ) で文字列変換していましたが、以下のコードでは、BufferedReader を使って readLine しています。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;


public class NioGet {

	public static void main(String[] args) {
		// コマンドを入力する為の 128 バイトのバッファ
		byte[] line = new byte[128];
		// コマンド部分を抽出する文字列
		String command = "";
		int i_len = 0;
		// 終了コマンドは "q"
		while( !command.equals("q") ) {
			
			try {
				// プロンプト出力
				System.out.print("java>");
				// 入力
				command = (new BufferedReader( new InputStreamReader(System.in, "SJIS") )).readLine();
			} catch (IOException e) {
				e.printStackTrace();
			}
			
			// コマンド処理( 大文字小文字を区別しない )
			if ( command.toUpperCase().equals("GET") ) {
				JsonGetFromFile();
			}
		}
		
		System.out.print("プログラムを終了しました");

	}
	
	public static void JsonGetFromFile() {
		
		FileSystem fs = FileSystems.getDefault();
		byte[] file_dataFiles = null;
		
		Path target = fs.getPath("C:\\user\\lightbox\\java2\\JSON\\sample1\\JsonGet2\\file\\json.txt");
		try {
			file_dataFiles = Files.readAllBytes(target);
		} catch (IOException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}
		
		String string_file_data = new String(file_dataFiles);
		System.out.println(string_file_data);
		
		print_json(string_file_data);
		
		// Gson を作成
		Gson gson = new Gson();
		
		// 全体の文字列を JSON_ENTRY クラスに投入
		// ( 未定義のものは無視されます )
		JSON_ENTRY je = gson.fromJson(string_file_data,JSON_ENTRY.class);
		// 固定フォーマットであればこの方法が確実
		System.out.println(je.id);
		System.out.println(je.description);
		System.out.println(je.status.text);
		// 存在する場合のみ出力
		if ( je.status.abc != null ) {
			System.out.println(je.status.abc);
		}
	}

	// デシリアライズ用のクラス
	static class JSON_ENTRY {
		String id;
		String description;
		JSON_STATUS status;
	}
	static class JSON_STATUS {
		String text;
		String abc;
	}
	
	
	public static void print_json( String json_string ) {
		
		// パーサーを取得
		JsonParser jp = new JsonParser();
		// 文字列をパース
		JsonElement je = jp.parse(json_string);

		// key と value を取得する為に、JsonObject から、entrySet メソッドを実行
		Set<Map.Entry<String, JsonElement>> entrySet = je.getAsJsonObject().entrySet();

		// イテレータを取得
		Iterator<Map.Entry<String, JsonElement>> it = entrySet.iterator();

		// 一覧表示
		while(it.hasNext())
		{
			Map.Entry<String, JsonElement> entry = it.next();

			String key = entry.getKey();
			JsonElement value = entry.getValue();

			System.out.print(key+" : ");
			if ( value.isJsonObject() ) {
				System.out.println("【OBJ】-->" );
				
				print_json( value.toString() );
			}
			else {
				if ( value.isJsonNull() ) {
					System.out.println("NULL");
				}
				else {
					if ( value.isJsonArray() ) {
						JsonArray ja = (JsonArray)value;
						System.out.println("【ARRAY】-->" );
						print_json_array(ja);
					}
					else {
						System.out.println(value.getAsString());
					}
				}
			}
		}

	}
	
	public static void print_json_array( JsonArray ja ) {
		
		for( int i = 0; i < ja.size(); i++ ) {
			if ( ja.get(i).isJsonObject() ) {
				print_json( ja.get(i).toString() );
			}
			if ( ja.get(i).isJsonNull() ) {
				System.out.println("NULL");
			}
			if ( ja.get(i).isJsonArray() ) {
				print_json_array( (JsonArray)ja.get(i) );
			}
			if ( ja.get(i).isJsonPrimitive() ) {
				System.out.println(ja.get(i).getAsString());
			}
		}
		
	}


}

このテストは、System.nio を使った、ファイルの一括読み込みと、Gson を使った JSON の一覧処理です


【Javaの最新記事】
posted by lightbox at 2013-09-25 20:32 | Java | このブログの読者になる | 更新情報をチェックする
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり