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

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

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

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

Q&A

解決済

2回答

6249閲覧

【Java】System.in.read()とSystem.in.skip()について

Generalist

総合スコア11

Java

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

0グッド

0クリップ

投稿2015/09/18 11:37

失礼致します。
初歩的な質問をさせて頂きます。

Javaで、以下のようなプログラムを書きました。

package java;

import java.io.IOException;

public class Test {

public static void main(String[] args) throws IOException{ int i; String msg; while(true){ System.out.print("入力してください(1~9、10=A、11=B、12=C):"); i = Character.digit(System.in.read(),13); System.in.skip(256); if(i > 0){ break; } System.out.println("\n入力値が不正です。"); } System.out.println(i); }

}

上記の処理を行って、正常に動作はできているのですが、
System.in.skip(256);
は具体的にどのような処理を行っているのでしょうか?
skipのAPI説明を見て、nバイト飛ばす処理だと理解はできるのですが、
この場合にどのような効果があって、何故256を指定しているのか?

また、System.in.skip(256);を記述しないと、
入力値が不正だった場合に、while文を3回繰り返すようですが、
何故3回繰り返されるのか?も知りたいです。

ご教授頂けますでしょうか。
何卒よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

質問への回答ではありませんが、プログラムコードで気になった点があります。

質問文にあるプログラムを次のようにして動作させてみます。

  1. ファイルi名 in.txt を用意する。ファイルのサイズは0にする。
  2. プログラムをこのファイルから読み込むようにして実行する。
    $ java teratail.Test < in.txt

=> 無限ループになる。(Ctrl-C で強制終了できます)

原因は、ファイルの終わりに達すると System.in.read() が -1 を返すので、
i = Character.digit(System.in.read(),13) が -1 になり、while ループから抜けないからです。

修正方法はいくつもあると思いますが、一つの方法を以下に示します。

java

1import java.io.IOException; 2 3public class Test { 4 public static void main(String[] args) throws IOException { 5 while (true) { 6 System.out.print("入力してください(1~9、A(=10), B(=11), C(=12):"); 7 int c = System.in.read(); 8 if (c == -1) { // ファイルの終わり 9 break; 10 } 11 12 int i = Character.digit(c, 13); 13 if (i > 0) { 14 System.out.println("\n入力された数字は " + i + " です。"); 15 break; 16 } 17 18 System.out.println("\n入力値が不正です。:[" + (char) c + "]"); 19 // 次の行の頭まで読み飛ばす。(フアイルが終わった場合は -1 が返る。 20 if (skip_to_nextline() < 0) { // ファイルの終わり 21 break; 22 } 23 } 24 } 25 26 // 次の行の頭まで読み飛ばす。(フアイルが終わった場合は -1 が返る。 27 static private int skip_to_nextline() throws IOException { 28 while (true) { 29 int c = System.in.read(); 30 if (c < 0) { // ファイルの終わり 31 return -1; 32 } 33 if (c == '\n') { // 行の終わり 34 break; 35 } 36 } 37 return 0; 38 } 39}

でも↑にコードも、あまり良くはないです。
System.in.read() で読んでいくかわりに、readLine() で行単位に読んでいくほうが良いです。

投稿2015/09/18 22:37

katoy

総合スコア22324

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

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

0

ベストアンサー

おそらくWindowsでしょうか?

入力を行ったばあい、たとえば不正な値としてDを入力したとします。そしてENTERを押します。
すると、入力されたバイト列は、Dと、ENTERの0xD``0xAが含まれます。
それを読み飛ばすためにskipさせているのだと思います。
なぜ256をしているのかは、十分な長さという意味以外には特にないと思います。
2にしてもOKではないでしょうか。

投稿2015/09/18 11:47

編集2015/09/18 11:50
argius

総合スコア9388

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

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

Generalist

2015/09/18 11:49

はい、Windowsです。 Enterも読み込まれているのですね・・・。 気づきませんでした。とてもわかりやすく簡潔な回答をありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問