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

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

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

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

Q&A

解決済

1回答

1994閲覧

ログインシステムについて

KasperHekmatyar

総合スコア81

Java

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

0グッド

0クリップ

投稿2017/05/31 06:59

###前提・実現したいこと
IDとパスワードを入力して一致したらログインできるシステムを作る
練習をしています。

csvデータ(ID,パスワードデータ)は

sy_root,sy_pw
ge_root,ge_pw
ge_test1,1234
ge_test2,1234
ge_test3,1234

です。

String[] array = s.split(",");
String str_id = array[0];
String str_pw = array[1];

で一行目のsy_rootがarray[0]で、sy_pwIDがarray[1]になると思うのですが、
私の頭のイメージだと、どうしても2行目ge_rootがarray[2]になり、ge_pwがarray[3]になる気がしてならないのですが、どうしてそうならないのでしょうか?

###該当のソースコード

JAVA

1package Review; 2 3import java.io.BufferedReader; 4import java.io.FileReader; 5import java.io.IOException; 6 7public class CSVRead { 8 9 public static void main(String[] args) { 10 11 String s; 12 13 try { 14 15 BufferedReader br = new BufferedReader( 16 new FileReader("D:/javaide_ws_asou/WITC_SI_KENSHU_5TH/src/exercise_variable/testauth.csv")); 17 18 while ((s = br.readLine()) != null) { 19 20 String[] array = s.split(","); 21 String str_id = array[0]; 22 String str_pw = array[1]; 23 24 } 25 br.close(); 26 27 } catch (IOException e) { 28 29 System.out.println("IOException"); 30 31 } 32 } 33

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

guest

回答1

0

ベストアンサー

whileの中にあるs = br.readLine()によって、sに1行分の文字列が入っています。
(つまり、ループ1回目であればsy_root,sy_pwで、2回目であればge_root,ge_pwです。

次にループの中にある

java

1String[] array = s.split(",");

ですが、sをカンマで分割して新たに配列を作り出しています。
というわけで、1回目のループはsy_rootsy_pwの2つの要素を持つ配列がarrayという変数に入ることになります。

2回目のループでは再度、

java

1String[] array = s.split(",");

が実行されるので、新たな配列を作り出す動作をしますね。

よって、2回目のループでもarrayの中身はge_rootge_pwの2つの要素を持つ配列が作られます。(要素の追加ではないです。)

なので、2回目(=2行目)のループでもarray[0]とarray[1]にそれぞれの要素が入ることになるのです。

追記

readLineではbufferedReaderが消えるわけではありません。
その証拠に、下記の様にmarkとresetを使うと再び、データを先頭より取得し直すことも可能です。

java

1 br.mark(1024); //ここで最初の行をmark 2 3 while ((s = br.readLine()) != null) { 4 5 String[] array = s.split(","); 6 String str_id = array[0]; 7 String str_pw = array[1]; 8 9 } 10 br.reset();//mark位置までreset 11 while ((s = br.readLine()) != null) { 12 //ここでも上のループと同じようにsy_rootから始まるデータを取ることができる。 13 String[] array = s.split(","); 14 String str_id = array[0]; 15 String str_pw = array[1]; 16 17 } 18 br.close();

追記2

arrayはwhileの内部で宣言されている為、2回目のループではスコープから外れてデータは消えてしまいます。
データの遷移です。

1回目のループではデータがセットされていない。

イメージ説明

次のステップで配列が設定された

イメージ説明

2回目のループに入った時にはスコープから外れたので、Arrayには何も設定されていない状態イメージ説明

となります。
なので、イメージとしては1回目のループで使用したarray配列は破棄され、2回目に作り直したarray配列にデータを入れ直す処理となっています。

投稿2017/05/31 07:17

編集2017/05/31 08:18
motuo

総合スコア3027

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

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

KasperHekmatyar

2017/05/31 07:58

質問なのですが、ループ1回目の(s = br.readLine())をした際にbrに入っていた1行目はもうs に代入されていてbrからはもう1行目は消えているのでしょうか?バッファーした文字列を代入するということは移動してバッファーから消えるということなのでしょうか?
KasperHekmatyar

2017/05/31 08:06

度々質問で恐縮なのですが、ループ2回目ではString[] array = s.split(",");の際に2行目の文字列は1行目が入っているarray[]に入るのでしょうか?それとも1行目と2行目はそれぞれ異なるarray[]に入っているのでしょうか?
motuo

2017/05/31 08:19

>バッファーした文字列を代入するということは移動してバッファーから消えるということなのでしょうか?  ⇒移動してバッファーから消えるという事ではありません。「追記」を参照願います。 >それとも1行目と2行目はそれぞれ異なるarray[]に入っているのでしょうか?  ⇒異なるString配列に入っていますが、1行目に使ったArrayは破棄されています。「追記2」を参照願います。
KasperHekmatyar

2017/05/31 08:42

motuo様、とても丁寧で分かりやすい解説ありがとうございます!あと1つ分からないのですが、while文でどうしてループさせたらループ1回目で1行目の.readLine、ループ2回目で2行目の.readLineをするのでしょうか? 仮にfor分でしたら引数をiにしてi++、.readLineが(i)行目の処理を行うのでわかるのですが、このwhile文 だと(s = br.readLine())の行数が変化する要素がないので、私はどうしてもひたすら一行目をループするイメージがあるのですが、どうしてそうならないのでしょうか? ご教授いただけませんか?
motuo

2017/05/31 08:55

BufferedReaderはファイルポインタという、自身がファイルのどの位置にいるかという情報を内部に保有しています。readLineするとそれが1行下に移動する事になり、2行目が読まれる事になります。 ちなみに、前述したmark命令はこのファイルポインタの位置をマークしたものです。これをresetする事で再度、読込むことが可能になるのです。
KasperHekmatyar

2017/05/31 09:44

なるほど!わかりました! 丁寧な解説ありがとうございます。フォローさせていただきます。これからもよろしくお願い致します!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問