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

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

ただいまの
回答率

90.33%

  • Java

    14431questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 407

前提・実現したいこと

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]になる気がしてならないのですが、どうしてそうならないのでしょうか?

該当のソースコード

package Review;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class CSVRead {

    public static void main(String[] args) {

        String s;

        try {

            BufferedReader br = new BufferedReader(
                    new FileReader("D:/javaide_ws_asou/WITC_SI_KENSHU_5TH/src/exercise_variable/testauth.csv"));

            while ((s = br.readLine()) != null) {

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

            }
            br.close();

        } catch (IOException e) {

            System.out.println("IOException");

        }
    }

試したこと

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

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

より詳細な情報

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+3

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

次にループの中にある

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


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

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

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


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

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

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

 追記

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

            br.mark(1024); //ここで最初の行をmark

            while ((s = br.readLine()) != null) {

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

            }
            br.reset();//mark位置までreset
            while ((s = br.readLine()) != null) {
                //ここでも上のループと同じようにsy_rootから始まるデータを取ることができる。
                String[] array = s.split(",");
                String str_id = array[0];
                String str_pw = array[1];

            }
            br.close();

 追記2

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

1回目のループではデータがセットされていない。
イメージ説明
次のステップで配列が設定された
イメージ説明
2回目のループに入った時にはスコープから外れたので、Arrayには何も設定されていない状態イメージ説明

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/31 16:58

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

    キャンセル

  • 2017/05/31 17:06

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

    キャンセル

  • 2017/05/31 17:19

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

    キャンセル

  • 2017/05/31 17:42

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

    キャンセル

  • 2017/05/31 17:55

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

    キャンセル

  • 2017/05/31 18:44

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

    キャンセル

同じタグがついた質問を見る

  • Java

    14431questions

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