javaでキーボードからの入力を格納するやつがあって、
Scanner と BufferedReaderのやり方がありますが、これはどう違うのでしょうか?
それとも全く同じでしょうか?

たとえば、
■一つ目
import java.io.*;

class Sample3{
public static void main(String[] args) throws IOException{

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("文字列を入力してください");

String str1=br.readLine();


System.out.println("検索文字を入力してください");

String str2=br.readLine();
char ch=str2.charAt(0);

int num=str1.indexOf(ch);

if(num !=-1)
System.out.println(str1+"の"+(num+1)+"番目に「"+ch+"」が見つかりました");
else
System.out.println(str1+"に「"+ch+"」はありません");
}
}

■二つ目
import java.util.Scanner;

class Sample4{
public static void main(String[] args){

Scanner stdIn=new Scanner(System.in);
System.out.println("文字列を入力してください");

String str1=stdIn.nextLine();

System.out.println("検索文字を入力してください");

String str2=stdIn.nextLine();
char ch=str2.charAt(0);

int num=str1.indexOf(ch);

if(num !=-1)
System.out.println(str1+"の"+(num+1)+"番目に「"+ch+"」が見つかりました");
else
System.out.println(str1+"に「"+ch+"」はありません");
}
}

これら2つは全く同じ実行結果が得られると思うのですが、
Scanner と BufferedReader の使い分けるべき場合などあるのでしょうか?

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

A 回答 (2件)

ScannerよりBufferedReaderの方が読み込みが速いです。


しかし既に別の方がお答えされてるようにScannerの方が使い勝手は良いのでそれほど速度を重視しないならScannerでいいと思いますよ。
    • good
    • 0
この回答へのお礼

ありがとうございました。

助かりました。

お礼日時:2011/05/22 03:23

行単位で読み込むだけなら両者の差はあまりありませんが、クラスとしてはScannerのほうがはるかに高機能です。

それぞれが持っているメソッドのリストを見比べてください。
    • good
    • 0
この回答へのお礼

ありがとうございました。

なるほど。
今度からはScannerの方使います。

お礼日時:2011/05/22 01:17

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

QJavaのダウンロードについて

さっきパソコンの電源をいれたら

ダウンロード準備完了  Java(TM) Update

Java(TM) Updateを使って最新版をコンピュータにダウンロードすることができます。
最適なセキュリティーとパフォーマンスのため、今すぐ最新版をダウンロードすることをお勧めします。

Java(TM)6 Update 2 Available
Java(TM)6 Update 2 includes features and fixes to accelerate
your Java applications as well as updates to keep Java secure.

後で通知する   ダウンロード

という表示がでたのですが、ダウンロードしても問題ないのでしょうか?

Aベストアンサー

こんばんは
お持ちのPCにJavaがインストールされていれば Updateは自動で配信されます 
Java(TM)6 Update 2は今のJavaの最新ですから ダウンロードしても問題は有りません
ただ Javaはかなりの容量を使いますから(140MB位)新しいのを入れたら 以前のバージョンは削除した方がいいですよ
UpdateでHDDが一杯に成ってしまいますからね
                            参考まで

Q入力データ数を入力して、その数だけ整数値を入力し配列を格納した後、入力

入力データ数を入力して、その数だけ整数値を入力し配列を格納した後、入力した値を横に表示するプログラムを下記に作成したのですが、思う通りに表示されません。初期化しても最後の値になるし、なぜでしょうか?
import java.io.*;

class Hairetu1
{
public static void main(String args[]) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

System.out.print("データはいくつですか?");
String str = br.readLine();
int num = Integer.parseInt(str);

int a[]=new int[num];
int i,tmp=0;

for(i=0; i<a.length; i++){
System.out.print((i+1)+"番目は?");
str = br.readLine();
tmp = Integer.parseInt(str);
a[i] = tmp;
}
for(i=0; i<a.length; i++){
System.out.print("入力した値は"+tmp+"\t");
}

入力データ数を入力して、その数だけ整数値を入力し配列を格納した後、入力した値を横に表示するプログラムを下記に作成したのですが、思う通りに表示されません。初期化しても最後の値になるし、なぜでしょうか?
import java.io.*;

class Hairetu1
{
public static void main(String args[]) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

System.out.print("データはいくつですか?");
String str = br.readLine();
int num = Integer.parseInt(str);

int...続きを読む

Aベストアンサー

System.out.print( "入力した値は" + a[i] + "\t" );

QJAVAダウンロード出来ません。

JAVAソフトウェアダウンロードのページでダウンロードを試みましたが、
http://www.java.com/ja/
ダウンロードを開始すると
"設定を確認中"と出てダウンロードが開始されません。
どうすればダウンロードできますか?

Aベストアンサー

手動で一旦ダウンロードしてから、インストールもできませんか?
http://www.java.com/ja/download/manual.jsp

Q整数値を任意のオブジェクトを格納できるスタッククラスに格納する方法

class ObjStack {
private Object[] mBuf;
private int mSP;

public ObjStack(int size) {
mSP = 0;
mBuf = new Object[size];
}

public int getSize() { return mBuf.length; }
public int getNum() { return mSP; }
public boolean isFull() { return mSP == mBuf.length; }
public boolean isEmpty() { return mSP == 0; }

public void push(Object x) {
if (!isFull()) {
mBuf[mSP++] = x;
}
}

public Object top() {
Object obj = null;

if (!isEmpty()) {
obj = mBuf[mSP-1];
}
return obj;
}

public Object pop() {
Object obj = null;

if (!isEmpty()) {
obj = mBuf[--mSP];
}
return obj;
}
}

上のプログラムは任意のオブジェクトを格納できるスタッククラスです。
int型の値はオブジェクトではないので、このObjyStackクラスに格納することができない。
整数値をこのObjStackクラスに格納する方法を教えて下さい。

class ObjStack {
private Object[] mBuf;
private int mSP;

public ObjStack(int size) {
mSP = 0;
mBuf = new Object[size];
}

public int getSize() { return mBuf.length; }
public int getNum() { return mSP; }
public boolean isFull() { return mSP == mBuf.length; }
public boolean isEmpty() { return mSP == 0; }

public void push(Object x) {
if (!isFull()) {
mBuf[mSP++] = x;
...続きを読む

Aベストアンサー

> よろしければ、どのように使用すればよいのか詳しく教えてくれませんか?お願いします。

例えば、

public void intPush(int intVal) {
 ObjStack objStack = new ObjStack(100);
 Integer val = new Integer(intVal);

 objStack.push(val);
}

でスタックにプッシュすることができます。
ポップする場合には、例えばこんな感じでしょうか?

public int intPop() {
 Object obj = objStack.pop();

 if (obj instanceof Integer) {
  return ((Integer)obj).intValue();
 }
}

参考URL:http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/Integer.html

QJAVA開発キットのダウンロード法。

プログラミング全くの初心者ですが、JAVAを始めてみたいと思っています。ところがJAVAの入門書を手に入れたところ、JAVAの開発キットをダウンロードしようとしてみましたが、入門書が古いせいか、そのダウンロードサイトの様子が変わっていたり、また英語表記だったりして自分なりにいろいろとやってたものの、よくわかりません。どなたか、最新のJAVA開発キットのダウンロード法を詳しく教えて頂けないでしょうか…。使用OSは、WindowsXPです。

Aベストアンサー

Windows版でいいんですよね?
下記のURLから、

・「JDKのダウンロード」をクリック
・「ACCEPT」にチェック
・Windows Platform - J2SE(TM) Development Kit 5.0 Update 6の「Windows Offline Installation, Multi-language」をクリック
・もう一度 Windows Platform - J2SE(TM) Development Kit 5.0 Update 6の「Windows Offline Installation, Multi-language」をクリック

で、ダウンロード出来ます。

参考URL:http://java.sun.com/j2se/1.5.0/ja/download.html

Qキーボードから10人分の点数を格納する配列を用意し、平均点および平均点

キーボードから10人分の点数を格納する配列を用意し、平均点および平均点以上の人数と番号を表示するプログラムで、下記のプログラムを作成してみたんですけど、平均点以上の人数と番号がうまく表示されません。if文でも人数は0になるし、番号は1~10番まで表示されるし、なぜでしょうか?

import java.io.*;

class Hairetu2
{
public static void main(String args[]) throws IOException
{
System.out.println("10人分の点数を入力してください。");

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

int s[]=new int[10];

int i;
int sum=0,count=0;
double avg=0;

for(i=0; i<s.length; i++){
System.out.print((i+1)+"番は?");
String str = br.readLine();
int a = Integer.parseInt(str);
s[i]=a;

sum+=a;
avg = (double)sum/10;

if(avg<=count)
count++;
}
System.out.println("平均点は"+avg);
System.out.println("平均点以上の人は"+count+"人");

for(i=0; i<s.length; i++){
if(i>=avg)
i++;
System.out.print((i+1)+"番\t");
}
}
}

キーボードから10人分の点数を格納する配列を用意し、平均点および平均点以上の人数と番号を表示するプログラムで、下記のプログラムを作成してみたんですけど、平均点以上の人数と番号がうまく表示されません。if文でも人数は0になるし、番号は1~10番まで表示されるし、なぜでしょうか?

import java.io.*;

class Hairetu2
{
public static void main(String args[]) throws IOException
{
System.out.println("10人分の点数を入力してください。");

BufferedReader br = new BufferedReader(new InputStreamR...続きを読む

Aベストアンサー

ループの1順でなにが行われるのか
変数が表している値はなにか
といったところを、よく考えなおしてください。
紙とエンピツで手計算する時にどういう順番でやるかを考えてみるのも手です。

> avg = (double)sum/10;
この時点では、sumには「今まで入力した人数分の合計」が入っています。
10人になるのは最後の1回だけです。それ以外は10で割っても平均にはなりません。
また、それまでの人数(=i+1)で割っても、「それまでの人数分の平均」であって「10人分の平均」ではありません。

> if(avg<=count)
> count++;

avgは「平均値」、countは「平均値以上の人の人数」ですよね?
この2つを比較する意味ってありますか?
また、上に書いたように、このループでは「全員の平均点」は計算できないのですから、「平均点以上かどうか」なんて判定できませんよね。

>if(i>=avg)
>i++;

これはさらに意図が不明です。
iはループで何番目かを表わすのに使っているようですが、それと平均値を比較する意図がわからないですし、判定結果によってはiを増やそうとするのもわかりません。
おそらく、平均が10以上になっているので i++が実行されず、1番から10番まで表示されたのでしょう。平均を5点くらいになるように入力してみてください。番号が飛び飛びになるはずです

ループの1順でなにが行われるのか
変数が表している値はなにか
といったところを、よく考えなおしてください。
紙とエンピツで手計算する時にどういう順番でやるかを考えてみるのも手です。

> avg = (double)sum/10;
この時点では、sumには「今まで入力した人数分の合計」が入っています。
10人になるのは最後の1回だけです。それ以外は10で割っても平均にはなりません。
また、それまでの人数(=i+1)で割っても、「それまでの人数分の平均」であって「10人分の平均」ではありません。

> if(avg<=count)
> count+...続きを読む

QJAVAのコンパイラのダウンロードについて

 最近、JAVAを勉強しようと思い、JAVAのコンパイラができるというJDKと呼ばれるものををダウンロードしようとしたのですが、ページが英語のせいでどうすればダウンロードできるのか全く分かりません。

 今のところ、勉強するだけなので無償と言うこれをダウンロードしたいのですが、いったいどこをどうすれば落とせるんでしょうか。

 あと、ほかにもForte for Javaを使えば便利と聞いたのですが、確かJAVAはテキストエディタとJDKがあれば作れると聞いたのですが、これはどういうことなのでしょうか。

 JAVAを始める以前の問題のような気もしますが、初心者なので誰か教えてください。

Aベストアンサー

http://java.sun.com/j2se/1.3/ja/download-windows.html を開いたら、
ページのやや下のほうにある、

Java 2 SDK, v 1.3.1_02 ソフトウェア Windows 95 / 98 / 2000 / NT 4.0 /Me (Intel プラットフォーム) 版のダウンロード

のところにあるcontinueボタンを押します。
そうすると、英語で使用契約書が表示されるので、
ページの最下部にあるACCEPT(同意する)というボタンを押すと、ダウンロード画面に進みます。
たくさんボタンが並んでいますが(やっぱり英語)、どれか1つをクリックするとダウンロードが始まります。

こんな感じでダウンロードがんばってください。

Q複数行キーボード入力した後に再度入力する?

複数行まとめてキーボードから入力を得た後に、再度入力を得たいのですが方法がわからず困っています。

whileループで複数行入力しCTRL_Dで入力終了、その後再度キーボード入力を得るようにコードを書きましたが、うまくいきません。


1、スキャナーを使用
public static void main(String[] args) {
 Scanner sc = new Scanner(System.in);
 List<String> list = new ArrayList<String>();
 System.out.println("Enter several lines:");
 while (sc.hasNextLine()) {
  list.add(sc.nextLine());
 }
 System.out.println("\nEnter another line:");
 String str = sc.nextLine();
 // 上の位置で例外(NoSuchElementException)発生
 System.out.println("Done!");
}


2、BufferedReaderを使用
// 例外は発生しないが、二回目の入力が不可
public static void main(String[] args) {
 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 List<String> list1 = new ArrayList<String>();
 System.out.println("Enter several lines:");
 String str;
 try {
  while ((str = br.readLine())!=null) {
   list1.add(str);
  }
  System.out.println("\nEnter another line:");
  String line = br.readLine();
  // ↑の位置でキーを何も押していないのに勝手にlineにnullが挿入され、
  // Done!が出力される
  System.out.println("Done!");
 } catch (IOException e) { e.printStackTrace(); }
}

アドバイス宜しくお願いします。

複数行まとめてキーボードから入力を得た後に、再度入力を得たいのですが方法がわからず困っています。

whileループで複数行入力しCTRL_Dで入力終了、その後再度キーボード入力を得るようにコードを書きましたが、うまくいきません。


1、スキャナーを使用
public static void main(String[] args) {
 Scanner sc = new Scanner(System.in);
 List<String> list = new ArrayList<String>();
 System.out.println("Enter several lines:");
 while (sc.hasNextLine()) {
  list.add(sc.nextLin...続きを読む

Aベストアンサー

1.のスキャナを使う方法で、
2回目の入力待ち String str = sc.nextLine(); の前に
sc = new Scanner(System.in);
をもう一度付けてみるのはどうでしょうか。
1回目の入力で終了状態になったスキャナは捨てて、
新しいスキャナで入力するという意味です。

Qjavaのapiをダウンロードしたいです。

Java EEをダウンロードするのではなくてJava SEをダウンロードして、必要に応じてapiをダウンロードしたいのですが、apiはどこからダウンロードすればよいのでしょうか?

javaxが含まれるのを使いたいです。

かなり調べたのですが、意外とどこにも回答がなく困っております。
初心者ですが、よろしくお願いします。

Aベストアンサー

eclipse なんかの初期設定だと、APIドキュメントはネット上のものが見れるようになっています。
API を zip でダウンロードしておきたいということなら、以下のページからダウンロードできます。(Java SE 7 を除く)
http://www.oracle.com/technetwork/jp/java/javase/documentation/api-jsp-316041-ja.html

---
Java SEのバージョン 1.3.0、1.4.0、5.0、6 の日本語ドキュメントは、こちらのページでアーカイブ・ファイルも提供しています。
---
このように書いてある部分のリンクをクリックしてください。

Qファイルからの入力 Scannerクラス

ファイルの内容を読み込むプログラムをJavaで作成しています。
Scannerクラスを利用するため、以下のようにimport宣言しました。

package bc;
import java.util.Scanner;
class FileScanner
{
 コンストラクタ{

  }
 メソッド{

  }
   :
   :
 mainメソッド{

  }


という感じで書いているのですが、この場合のメソッド名は、
Scannerクラスで定義されている名前でないとダメなのでしょうか?
自分で作った名前でメソッドを定義したのですが、

Scannerクラスで定義されていません。

というようなエラーが返ってきてうまくいきません。
どなたか、ご教授くださいm(_ _)m

Aベストアンサー

ANo.1さんのおっしゃるとおりで、何をおっしゃっているのかよくわからないのですが、
Javaのクラスに関して、根本的なところで勘違いがありそうです。

Scannarクラスに動作をさせたいというプログラムなのですから、
Scannerクラス内のメソッドを書かないで動作するはずがないと思うのですが。

もちろん、あなたが作ったメソッドの中でScannerクラスのメソッドを呼ぶようにすればできます。

Javaから離れて、一般的な話をすると、
「あなた」が「電話」をかける場合、
「あなた」が「電話」の「送話部」を「耳にあてる」
「あなた」が「電話」の「ボタン」を「押す」
わけです。
ここで、JAVAのオブジェクト指向風にいうと
「あなた」:mainメソッドを含んだあなたが作成したクラス
「電話」:Scannerクラス
「送話部」「ボタン」:Scannerクラス内の各メンバ変数
「耳に当てる」「押す」:Scannerクラス内の各メソッド
となります。

どんなにがんばっても「あなた」が「電話」になることはないわけで
あなたが勝手に作ったメソッドを呼んでScannerクラスが動作することはないのです。

ANo.1さんのおっしゃるとおりで、何をおっしゃっているのかよくわからないのですが、
Javaのクラスに関して、根本的なところで勘違いがありそうです。

Scannarクラスに動作をさせたいというプログラムなのですから、
Scannerクラス内のメソッドを書かないで動作するはずがないと思うのですが。

もちろん、あなたが作ったメソッドの中でScannerクラスのメソッドを呼ぶようにすればできます。

Javaから離れて、一般的な話をすると、
「あなた」が「電話」をかける場合、
「あなた」が「電話」の「送話...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報