現在Javaを勉強中で、ユーザーのキーボード入力を読み込んで表示する簡単なプログラムで疑問があります。

----------サンプルコード(読みにくいので例外処理を省略)--------------------------
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);

for(int i=0;i<5;i++){
System.out.print("文字を入力して下さい>>");//・・(1)
arr[i] = br.readLine(); //キーボード入力を読み込み・・(2)
}
----------------------------------------------------------
疑問なのは内部での処理なのですが、
上のコードを実行すると、(1)の部分が1行出力されてキーボード入力を待っている状態になります。
ここで適当な文字を入力してキーボードのEnterを押すと、入力が配列へコピーされ、再度ループ頭の(1)へ戻ります。

なぜ"(1)の部分が1行出力されてキーボード入力を待っている状態"が起こるのでしょうか?

自分なりの予想としてはreadLine()は行末までのバッファリングをするので、行末を知らせるEnterを押すまでreadLine()が動き続けているのかなと思うのですが確証がありません。

また、バッファについてですが、ストレージへ保管されるタイミングはキーボード入力を1文字入力するごとでしょうか?Enterを押したタイミングでしょうか?
これについてはInputStreamReaderってのが1文字ごとに入力を受け取ってバッファへ送っている、で合っているでしょうか?

どなたか詳しい方いらっしゃいましたら、どうぞよろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

>なぜ"(1)の部分が1行出力されてキーボード入力を待っている状態"が起こるのでしょうか?



厳密に言うと入力を待っている状態はreadLine()です。(つまり(2)になります)
System.inというのがキーボード入力のストリームを取得します。
この入力ストリーム(InputStream)のread(byte[] b)でキーボードの入力を待ちます。
この場合readLine()の処理の途中でこれが実行されていると考えてください。

>また、バッファについてですが、ストレージへ保管されるタイミングはキーボード入力を1文字入力するごとでしょうか?Enterを押したタイミングでしょうか?

ストレージとはHDDなど電源を切った(処理が終了した)後でもデータが残っている場所のことを言います。
おそらくこの場合arr[i]に保管していることを言っていると思うので「メモリに保管する」もしくは「変数に保管する」が正しいと思います。
で、回答ですが、System.inがEnterを押下したタイミングでそれまで入力した文字をInputStreamに取得します。(つまりflushする)
Enterが押下されるまではプログラム上では何も起きていません。
ただし、InputStreamはバイトで取得するため、InputStreamReaderで1文字ずつ文字に変換し、BufferedReaderで変換したすべてを返します。
    • good
    • 0
この回答へのお礼

お二人の回答を併せてようやく理解出来ました☆
ストレージについてもこれまで勘違いしていました;
askaaskaさん、DMXbwさん、ご親切にありがとうございました。

お礼日時:2009/05/19 15:03

> なぜ"(1)の部分が1行出力されてキーボード入力を待っている状態"が起こるのでしょうか


これはSystem.inの仕様よ。
System.inがユーザの入力待ちをする仕様になっているので
この動きをするわ。
Javaのストリームっぽく言えば
System.inのflushタイミングが、
ユーザのEnterをトリガーにしているのよ。
PrintStreamと同じね。
Readerでラップする場合は
PrintWriterと同じになるわ。


> ストレージへ保管~
あなたの提示したコードには
ストレージへの保管を行うような場所はないけど。
この質問は何を言っているのかわからないわ。
ここで言うストレージというのは
バッファされているものが別の場所に移される
という意図でいいのかしら。
だとしたらその回答は
flushしたタイミング
になるわ。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qキーボードが反応しない状態でのウイルスチェック

windows98でキーボードが反応しなくなった。キーボードを新しく買い換えても反応しない。起動時にパスワードを打つように設定されているので、パソコンを使用できない。この状態でウイルスチェックをすることは可能でしょうか?

Aベストアンサー

パソコンを起動できないのにウィルスチェックは無理。

リカバリする。

98はサポート終了により、更新もできず、ウィルス対策ソフトもサポート終了で危険です。

QBufferedReader.readline()で読み込んだ文字列の

BufferedReader.readline()で読み込んだ文字列の長さがおかしい。

質問させてください。
BufferedReader.readline()を使用して入力した文字列の長さを表示させると、値が正しく表示されません。

例えば、「東京都千代田区」と入力した場合、長さは9と表示されます。
(東京都と入力すると長さは3と表示されます)

どなたか原因をご存知ありませんでしょうか。

コードを以下に記載します。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Question_1_1 {
/*
* メイン関数
* @param args 起動引数
*/
static public void main(String[] args) throws IOException{
InputStreamReader input = new InputStreamReader(System.in);
BufferedReader buff = new BufferedReader(input);
String str = "";

System.out.println("文字列入力>");
str = buff.readLine();
System.out.println("文字列長さ : " + str.length());

// ストリームを閉じる
input.close();
buff.close();

}
}

BufferedReader.readline()で読み込んだ文字列の長さがおかしい。

質問させてください。
BufferedReader.readline()を使用して入力した文字列の長さを表示させると、値が正しく表示されません。

例えば、「東京都千代田区」と入力した場合、長さは9と表示されます。
(東京都と入力すると長さは3と表示されます)

どなたか原因をご存知ありませんでしょうか。

コードを以下に記載します。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Questi...続きを読む

Aベストアンサー

文字コードが食い違っているのだと思います。
コンソールから呼んでいるのであればchcpするか、もしEclipseを使っているならeclipse.iniに次の一行を足してみてください。


-Dfile.encoding=utf-8

Qキーボードで反応しないキーがある

キーボードで押しても反応しないキーがあり困っています。
全ては確認していないですが、A,S,D,F,など外側のキー、十字キー4つ、テンキーの1、2(3などは表示する)、BackSpaceキー、などが押しても画面に何も表示されません。

「コントロールパネル」の「キーボード」では、101/102英語キーボードまたはMicrosoft Natural PS2キーボードとなっていますが、キーを数えたら109個ありました。デバイスを日本語 PS/2 キーボード (106/109 キー Ctrl+英数)に変えても治りませんでした。(今はロールバック(?)で元に戻しました。)

PCはBTOでWindowsXP SP3、キーボードとマウスは数年前のコンパックPCのPS/2を使用しています。
これではPCが使えないので、できるだけ早めに教えて下さい。お願いしますm(__)m

Aベストアンサー

No.1です。
単一のキーだけ反応しないのであれば、接点が減るなど接触不良が疑われますが、
範囲内の複数のキーがダメになってるとするとキーボード内部にあるコントローラチップの異常か、
基板上の配線のチップに近い方に断線があると考えられます。
いずれにしても素人目で「ここが異常」と判断して修理することは困難でしょう。

キーボード全体が反応しないのであれば、パソコン本体側か、途中のケーブル、コネクタあたり
の異常も考えられますが、今回のケースだと除外して良さそうです。

メンブレン式のキーボードは安いし打鍵音が静かでいいのですが、
仕事で使ってると接点が減るのが早くて早くて‥‥。2年で3つとか交換してました。
茶軸とか黒軸とか使うようにしてからは長持ちしてますね。打鍵音がうるさいですけど。

QString a = "a"; と String b = new String ("b"); の違い

String a = "a";
String b = new String ("b");

お伺いしたいのですが、
b は String のインスタンスを作ってると思いますが、
a はどんなことをしてるのでしょうか?

Aベストアンサー

お二人の回答を具体的に言うと、こういうことです。
String a1 = "a";
String a2 = "a";
String b1 = new String ("b");
String b2 = new String ("b");

a1のために、aという文字列のインスタンスが作られますが、
a2に代入されるのは、a1に使われたインスタンスが再利用されます。
これは、
if(a1 == a2) System.out.print("a1と同じインスタンス");
の結果でもわかります。

一方、b1とb2は、bという文字列オブジェクトを引数に、新しいインスタンスを生成する指示がありますので、b1とb2と、その初期化に使った無名のStringインスタンスの3つがメモリ上に存在することになります。
if(b1 != b2) System.out.print("b1とは違うインスタンス");
の結果でもわかると思います。

したがって、
String b = new String ("b"); というのは、Integerに例えると
Integer i = new Integer(new Integer(1)); という処理を
していることになり、ひとつ無駄なインスタンス生成となります。

お二人の回答を具体的に言うと、こういうことです。
String a1 = "a";
String a2 = "a";
String b1 = new String ("b");
String b2 = new String ("b");

a1のために、aという文字列のインスタンスが作られますが、
a2に代入されるのは、a1に使われたインスタンスが再利用されます。
これは、
if(a1 == a2) System.out.print("a1と同じインスタンス");
の結果でもわかります。

一方、b1とb2は、bという文字列オブジェクトを引数に、新しいインスタンスを生成する指示がありますので、b1とb2と、その...続きを読む

Qキーボードの一部のキーが反応しない

本日PCソフトPowerSuite2012のMaxidiskでハードディスク内の不要なファイルを削除した後、
キーボードを使用したら一部のキーが反応しなくなりました。
反応しないのはホームポジション内の[5]と[6]、[ほ]と[へ]のキーです。
また[半角/全角]キーを押して、【直接入力】から【ひらがな入力】への切り替えも出来なくなりました。

ちなみにデバイスマネージャにてキーボードのプロパティを確認したところ、
[PS2 keybord(106 keys ctrl + caps)]、製造元:Logicoolでした。

どうすれば改善するのか分かりません。
ご回答よろしくお願い致します。

使用OS:Windows xp

Aベストアンサー

どう考えても「キーボードそのもののハードウェアの故障」なので、ソフトウェアはそれ以上いじってはいけません。

リカバリなどもってのほか。キーボードのデバイスドライバの入れ直しも不要。

ソフトウェアをいじるのは、余計に事態を深刻にするだけで、何の解決もしません。

で、どうして「ハードウェアの故障」と断言できるかと言うと

「効かないキーの並びに、物理的な規則性が見られる」

からです。

つまり、一番上の列で、効かないキーの並びが

×○○○○×

の繰り返しになっていて、物理的な規則性が見られる、と言う事。

全1 2 3 4 5 |6 7 8 9 0 ほ|へ¥
×○○○○×|×○○○○×|×○

キーボードのキースイッチは、1段ごとに何個かまとめて順に電気的にセンスしているので、どこかがショートしたり断線したりすると、動かなくなるキースイッチの並びに、上記のような「規則性」が出る事があります。

なので「物理的(ハードウェア的)な破損や故障の可能性が非常に高い」と言えます。

なお、ずいぶん昔「キーが効かない」と思ってキーボードを分解掃除したら、接点の所に「イニシャルG」の小さいのが挟まって死んでた事が…。

どう考えても「キーボードそのもののハードウェアの故障」なので、ソフトウェアはそれ以上いじってはいけません。

リカバリなどもってのほか。キーボードのデバイスドライバの入れ直しも不要。

ソフトウェアをいじるのは、余計に事態を深刻にするだけで、何の解決もしません。

で、どうして「ハードウェアの故障」と断言できるかと言うと

「効かないキーの並びに、物理的な規則性が見られる」

からです。

つまり、一番上の列で、効かないキーの並びが

×○○○○×

の繰り返しになっていて、物理的な規則性が見...続きを読む

Qフォーム内のテキストフィールドにアドレスを入力後、Enterキーを入力して移動したい

フォーム内のテキストフィールドにアドレスを入力後、Enterキーを入力して
移動するにはどうすればよいのでしょうか?

以下のようなコードを作成したのですがうまくいきませんでした。

<html>
<head>
<script type="text/javascript">
function jumpURL()
{
url = document.f.t.value;
location.href = url;
}
</script>
</head>
<body>
<form name="f" onSubmit="jumpURL()">
<input type="text" name="t" id="t">
</form>
</body>
</html>

ご存知の方がおられましたらご回答をよろしくお願いします。

Aベストアンサー

こんな流れで良いじゃないかな?(動作未確認)
window.onload = function(){
document.getElementById('t').onkeydown = function (ev){
var ev = (!ev) ? event:ev;//Firefox1.5ではevにイベントが入る
var key = ev.keyCode;//取り合えずkeyCodeを取る。
alert(key)//Enterキーを押して確認してください。
var mf = (ev.modifiers) ? ev.modifiers : ((ev.altKey) ? 1 : 0) + ((ev.ctrlKey) ? 2 : 0) + ((ev.shiftKey) ? 4 : 0);//NNがmodifiersでIE,FirefoxがctrlKey、shiftKey、altKeyだったかな?
alert(mf)//Enterキーを押して確認してください。
var k = key + '_' + mf;//ここでkeyCode_modifiersと言う形を作る。
alert(k)//Enterキーを押して確認してください。
if(k == '13_0'){//Enterキーで装飾キーが押されていない。
url = document.f.t.value;
location.href = url;
}
}
}

こんな流れで良いじゃないかな?(動作未確認)
window.onload = function(){
document.getElementById('t').onkeydown = function (ev){
var ev = (!ev) ? event:ev;//Firefox1.5ではevにイベントが入る
var key = ev.keyCode;//取り合えずkeyCodeを取る。
alert(key)//Enterキーを押して確認してください。
var mf = (ev.modifiers) ? ev.modifiers : ((ev.altKey) ? 1 : 0) + ((ev.ctrlKey) ? 2 : 0) + ((ev.shiftKey) ? 4 : 0);//NNがmodifiersでIE,FirefoxがctrlKey、shiftKey、altKeyだったかな?
al...続きを読む

Q[大至急]キーボードが反応しない!

[大至急]キーボードが反応しない!
キーボードの次のキーが打てません。
6 E T Y U I D Z
何が原因でしょうか?
winxp sp3 です。

Aベストアンサー

おそらくキーボードが壊れてる。
特にE T Y U Iの5文字は横一列の直線上だから、内部のマトリクスがイカれたんじゃないだろーか。
※添付した画像みたいなヤツ。接点が磨耗してくるとパターン上につながってるキーがまとめて反応しなくなる。

PCがデスクトップなら簡単に交換できるけど、ノートならメーカーに修理に出すしかない。
修理代のことを考えると、No.1の人が言ってるようにノートは買い替えを検討したほうがいいかも知れない。

Q

を統合変換

テキストの改行変換をジャバスクリプトで、

if(getId("br_1").checked==true){
str = str.replace(/&lt;br&gt;/g, "\n");
}
if(getId("br_2").checked==true){
str = str.replace(/(&lt;br \/&gt;)/g, "\n");
}

<input type="checkbox" name="br_1" />削除1
<input type="checkbox" name="br_2" />削除2

これで、
<br>と<br />が\n変換されるようになりましたが、
これで書き方は正しいでしょうか?
また、
これをラジオボタンで
「なし」「削除1」「削除2」と単一選択にしたいのですが、
どうやればよいのでしょうか?

 

Aベストアンサー

<input type="radio" name="br" >なし
<input type="radio" name="br">削除1
<input type="radio" name="br">削除2

typeをラジオボタンにして、名前を同じにすれば
ひとまとまりになります。

あとはJSのonselectやonclickメソッドを使って
処理してやれば処理してやればいいでしょう。

replaceを使った書き換えはよくやる方法ですので問題ないと思いますよ。

Qワイヤレスキーボード/マウスがたまに反応しない

2.4GHzワイヤレス(Unifying対応)のマウス/キーボードセットを購入しました。

マシン本体から直線で3mほど離れた位置で使っているのですが、キーボードは極まれに入力が反応しない程度なのですが、マウスはたまにフリーズしたみたいに動かなくなります。
酷い時には数秒反応しません。

ワイヤレスというのはこんなものなんでしょうか?

Aベストアンサー

しばらく(マウスやキーボード単体で)操作していない状態から操作しだしたら即動かないという事なら、それはスリープから復帰中のためです。

QEnterキーを押すとsubmitされる

画面で入力行が1行のとき、入力して、Enterキーを押すとsubmitされます。
入力行が2行あるときは、submitされません。

プログラムの中には、OnKeyboadの記述はありません。

よろしくご教授ください。

Aベストアンサー

フォームのテキストボックスのエンターは原則サブミットですね
2行あるというのはテキストエリアのことでしょうか?
javascriptで制御するってことでよろしいですね?

<script>
try{
document.addEventListener('keypress',function(e){pressfunc(e)},true);
}catch(e){
document.attachEvent('onkeypress',function(e){pressfunc(e)});
}
function pressfunc(e){
var t = (e.srcElement || e.target);
var v=t.value;
if(t.nodeName!="INPUT" && t.nodeName!="SELECT") return false;
if(e.keyCode==13){
if(e.preventDefault)e.preventDefault(); //基本
else e.returnValue = false; //IE
}
}
</script>

<form>
<input type="text" name="n" vakue="xxx">
<textarea name="t">yyy</textarea>
<input type="submit" vakue="go">
</form>

フォームのテキストボックスのエンターは原則サブミットですね
2行あるというのはテキストエリアのことでしょうか?
javascriptで制御するってことでよろしいですね?

<script>
try{
document.addEventListener('keypress',function(e){pressfunc(e)},true);
}catch(e){
document.attachEvent('onkeypress',function(e){pressfunc(e)});
}
function pressfunc(e){
var t = (e.srcElement || e.target);
var v=t.value;
if(t.nodeName!="INPUT" && t.nodeName!="SELECT") return false;
if(e...続きを読む


人気Q&Aランキング