アプリ版:「スタンプのみでお礼する」機能のリリースについて

dirコマンドを実行して、結果を表示するJavaプログラム(プログラムは一番下に)なのですが
このプログラムをfor文でfor(int i=0;i<=13;i++)とこのように
やったら、以下のような結果になったのですが

//実行結果
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は xxxx-xxxx です

C:\Users\z\zw\zww(1) のディレクトリ

2010/10/19 11:11 <DIR> .
2010/10/19 11:11 <DIR> ..
2010/10/19 11:11 301 .classpath
2010/10/19 11:11 381 .project
2010/10/19 11:11 <DIR> .settings
2010/10/19 11:16 <DIR> bin
2010/10/19 11:16 <DIR> src
2 個のファイル 682 バイト
5 個のディレクトリ 48,884,387,840 バイトの空き領域
//実行結果ここまで

これをwhileで
while(true){
if(a.getLine()==null){
break;
}
System.out.println(a.getLine());
}
というようにやると以下のような実行結果になって、for文と同じ結果になるのが正
しい結果だと思うのですがなりませんでした。ループを抜けるために、break文をや
ったのですが、自分が考えた条件は、getLine()メソッドは読み込む行が無くなった
ら、nullを返すので、a.getLineがnullと同じになったらbreakをするという風に自
分ではしたつもりなのですが、条件が違うのかfor文のような結果が出ませんでした。

whileの場合なぜこのような結果になってしまったのかわからなく、
手詰まりになってしまったので、どなたかご教授ください

実行結果
ボリューム シリアル番号は xxxx-xxxx です
C:\Users\z\zw\zww(1) のディレクトリ
2010/10/19 11:11 <DIR> .
2010/10/19 11:11 301 .classpath
2010/10/19 11:11 <DIR> .settings
2010/10/19 11:16 <DIR> src
5 個のディレクトリ 48,886,591,488 バイトの空き領域
実行結果ここまで

//プログラム
import java.io.*;
class DirCmd{
BufferedReader br;
DirCmd(){//コンストラクタの定義(dirコマンドをここで実行)
try{
Process p = Runtime.getRuntime().exec("cmd /c dir");
InputStream is = p.getInputStream();
br = new BufferedReader(new InputStreamReader(is));
}catch(IOException e){}
}
public String getLine(){//dirコマンドの実行結果の一行を読む
String line = null;//読み込む行が無くなったらnullを返す
try{
line = br.readLine();
}catch(IOException e){}
return(line);
}
public static void main(String [] args){
DirCmd a = new DirCmd();

while(true){
if(a.getLine()== null){
break;
}
System.out.println(a.getLine());
    }
}
}

A 回答 (2件)

while文の実行結果がfor文の実行結果と比べて


必ず偶数行のみ出力されていませんか?
ここにgetLine()の使い方に誤りがあると思います。

getLine()は実行毎に結果を返しますよね?
「 if(a.getLine()== null){ 」の時点でaの中身を1行取得し
結果がnullか判断されています。
nullでなければ「 System.out.println(a.getLine()); 」が実行されますが
このときにはすでに2行目を出力していることになるのです。

ポイントはwhile文内で2回getLineを使わないことです。

と、ここまで偉そうなことを言っておいて解決策は
以下のようなものしか思い浮かびません・・・
以下を参考により良くして頂けると幸いです。
-------------------------------------------------
public static void main(String [] args){
DirCmd a = new DirCmd();

while(true){
//getLineの結果を保持する変数
String temp = a.getLine();

if(null == temp){
break;
}

//nullでなければ保持している内容を出力
System.out.println(temp);
}
}
    • good
    • 0
この回答へのお礼

回答有り難うございます。
最初の方が言っていたa.getLine()を理解していますか?というのは
こういうことだったのですね^^;
確かに実行してると、ところどころ抜けて出力されていたのでなんでだろう?
と思っていました。
理解不足でした。
本当に有り難うございました。

お礼日時:2010/10/20 01:32

a.getLine() がどういう動作なのか理解できていますか?

この回答への補足

a.getLine()が呼びされるたびに、brに格納された値が入っているのだと思っているのですが、
違うでしょうか?

補足日時:2010/10/20 00:58
    • good
    • 0

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