質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

1562閲覧

java BufferedReaderとScannerの使い分けについて

eclair02

総合スコア5

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2022/06/14 01:38

初めまして。
質問を読んでいただきありがとうございます。

私は将来ITの世界で働きたいと思い、転職を目指し職業訓練校でjavaを学んでおります。
学校の先生に聞くこともできるのですが、現役で活躍しているプログラマの皆様に伺ったほうがより現場のことを知れるかと思いましたので、質問をさせていただいております。

早速ですが、現在学校では郵便番号と住所が記載してあるcsvファイルを読み込み、それをMapに格納、その後標準入力で郵便番号を入力して、対応する住所をコンソールに表示するプログラムを課題として作成しています。

csvを読み込むという行為に関して、私が学んだ範囲では「BufferedReader」と「Scanner」があります。

どちらを使っても課題は完成しました。
そこでこの2つは普段皆様はどういった使い分けをしているのかが気になりました。

自分で調べた感じでは、Scannerのほうが記述が簡単でしかも例外処理も必要がなく、数値も受け取れるという点で優れているのかと思うのですが、
BufferedReaderのほうがパフォーマンスがいいという記事もあります。
学校の解説でもBufferedReaderが使われたコードが扱われています。

実際の現場でコードを書いている皆様はこれら2つをどういった使い分けで使用しているのでしょうか?
仕事の合間の休憩がてらでも構いませんので、ご教示いただけますと幸いです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

eclair02

2022/06/14 02:10

ありがとうございます。 結構調べまわったつもりなんですがネットの海は広いですね…。 特徴をとらえていかせる場面で、どっちでもいい時はどっちでもいいやってことですね。 どっちともうまいこといじれるように訓練しながら勉強します。お忙しいところご回答ありがとうございます。
jimbe

2022/06/14 03:38

回答に書かれたほうが良いのでは^^;
eclair02

2022/06/14 03:41

例外処理について勉強させたいからって観点もあるんですね。 例外処理も奥が深そうで面白いなって思って勉強してます。 あと、やはり実務ではコンソール上で何かをいじるなんてめったにないですよね…。 今は勉強上そういうプログラムが多いんですが、あくまで勉強のため便宜上こういうことをしてるって念頭に置いておきます。 始めてteratail使うので、ここが解答欄なのかと思ってました…笑 本当はここじゃないんですね笑
jimbe

2022/06/14 04:05

※「BufferedReaderとScannerの使い分けについて」の回答ではありませんのでこちらに書かせていただきます (_ _) 例外に限らず、プログラムがその役割を果たすことが出来なくなる事象が発生することを想定することは、プログラミングに必須です。 今はどうか知りませんが、プログラムコードの7~8割が「何か異常があった場合の処理」と言われたこともあった…ような気がします(非常に曖昧) その為(入門書でも技術書でも)主題を説明するためのサンプルコードに「何か異常があった場合の処理」まで含めてしまうとコードが増え、主題に関する部分が埋もれて分かり難くなってしまうので、大抵は省略されます。 授業で例外がどのような扱いを受けているのか全く知りませんが、異常時に適切な動作をさせるのは必須であり、java ではその始まりの一つが「例外」ですので、蔑ろに出来ない部類なのは確かと考えます。 [異常処理系の設計、プログラミング、テストの大切さ] https://el.jibun.atmarkit.co.jp/noriwo_t/2019/12/post_147.html
eclair02

2022/06/14 04:12

例外についてのご意見をいただきありがとうございます。 学校でも、例外が発生するとプログラムが止まる、止まるプログラムをお客様に提出するわけにはいかないからどうなっても止まらないプログラムを作ろうね、って話があります。 ただ、全コードの7~8割が例外処理の記述なこともあると伺い、驚いています。 その始まりの一つが例外という書き方をされるということはそれ以外に「異常時に適切な動作をさせるための手段」があるということなのですね…。 今は授業と合わせ、学習サイトでのアウトプットを欠かさず、できることをやっていこうと思います…。 お忙しいところご回答ありがとうございます。
jimbe

2022/06/14 04:44

ユーザからの入力があると異常時のコードが増えるのが分かり易いですね。 1~10 の数値を入力する為に System.out.println("input: "); int value = scanner.nextInt(); としたとしましょう。 1~10 をちゃんと入力してくれるユーザしか世の中にいなければこれで済みますが、中にはへそ曲がりとか天邪鬼とか悪戯好きとか悪意持ちがいるわけで、 0 とか -1 、 9999…とか入れる可能性もあります。これは java プログラムとしての異常では無く、仕様に対しての異常です。 対処として 1~10 以外はもう一回入力という仕様にして、 int value; do { System.out.println("input: "); value = scanner.nextInt(); } while(value < 1 || 10 < value); とすると、行数で 2 倍になります。 さらに、数値では無く文字("KI〇L YOU!"とか)を入力してくる輩もいるでしょう。 文字列で受け取って数値化し、数値化で失敗したら入力し直すようにすると、 int value; do { System.out.println("input: "); String str = scanner.next(); try { value = Integer.parseInt(str); } catch(NumberFormatException e) { value = 0; } } while(value < 1 || 10 < value); 10 行になりました。 これでもまだ、ユーザに対して「なぜ再入力なのか」の説明が表示されていないのでコードが不足していると思います。
eclair02

2022/06/14 04:53

どこまで考慮してどこまでのコードを書くか考えたら無限にコードが増えていきそうですねこれ…。 テストが大切だけど大変だと言われるわけがわかりました…w
dodox86

2022/06/14 08:15 編集

> どこまで考慮してどこまでのコードを書くか考えたら無限にコードが増えていきそう データの入力元が人間であったり未知の他システム(プログラム)であったりする実務では入力に対するチェックやエラー処理が増えがちですが、安全なデータだと保証できる仕様(制限)があれば意識すべき処理はごっそり省くこともできます。その範囲を決めるのが「設計」ですね。 まだ回答待ちなのかもしれませんが、一定の結論が得られたらいただいた回答に合点がいけばベストアンサーを差し上げるなり、回答を自ら投稿して自己解決し、質問を閉じるようにしましょう。 [一部編集済み]
eclair02

2022/06/14 15:16

ご教示いただきあアリが党ございます。 先生も最初は設計書の通りに作る仕事が主で、だんだん任される範囲が増えてきてー、のような話をしています。 設計書の通りに作る段階で、しっかり頭を働かせながらコーディングしていこうと思いました。 質問の今後の扱いについてもご教示いただきありがとうございます。 ベストアンサーを決めて、質問を閉じさせていただきます。
guest

回答2

0

ベストアンサー

教育的観点から言うと、

ってところでしょうか。

あと、実際のお仕事ではたぶん標準入力から読み込むことはほとんどない (ファイルの読み込みに BufferedReader を使うことはたまにある) ということもあるかと。

投稿2022/06/14 03:48

hoshi-takanori

総合スコア7895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

eclair02

2022/06/14 04:14

回答欄への移動ありがとうございます。 お手数をおかけいたしました。
hoshi-takanori

2022/06/14 15:35

書き忘れましたが、Scanner を使っても構わない場面としては、多少エラーチェックが甘くても構わずに手っ取り早く入力を行いたい場合ですね。 具体的には、入力ファイルの形式が決まってて大丈夫なはず (実際には、たまにおかしな入力があってバグの原因になることも少なくないですが…) とか、自分で値を入力してとにかく動かしたい場合とか、テストデータが決まってる競技プログラミングとか…。
guest

0

皆様、様々なご意見や現場の実態などをご教示いただきありがとうございます。
僭越ながら、解答欄に記載していただいた方の回答をベストアンサーとさせていただきました。
今後も勉強中、わからないことがあれば質問を書き込むことがあるかと思います。
またご縁がありましたらよろしくお願いいたします。

投稿2022/06/14 15:18

eclair02

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問