| English | 意味 |
|---|---|
| text file/tekst faɪl/ | テキストファイル |
空白行は無効なトークンではない
- テキストファイルには、空行の後に
12が続いています。初期状態では、hasNextLine()とhasNextInt()はともに真です:整数トークンのチェックは空白(空行を含む)をスキップして 12 を探します。 oopsに続けて12が含まれるファイルと比較する:別の行が存在するが、次のトークンは整数ではない。行の存在チェックでは整数形式を確認できない;読み取り内容と一致するガードを選択せよ。
デフォルトの区切り文字を使用する場合、空白行の後に 12 が含まれる Scanner は、開始時に hasNextInt() が true を返す。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
整数トークンのチェックは空白(空白行を含む)をスキップし、整数トークン 12 を見つける。
リーダーをソースに接続する
new Scanner(new File("scores.txt"))は指定されたファイルを読み込むが、new Scanner(System.in)はキーボード入力を読み込む。どちらも同じ Scanner メソッドを暴露しているが、ソースとその利用可能性は異なる。- 存在しないファイルを開くと
FileNotFoundExceptionがスローされる。以下の完全な例ではmainで宣言されているが、実際のアプリケーションではこれをキャッチして有用なエラーメッセージを出力してもよい。どちらの選択でもデータ喪失は生じない。
テキストファイルを読むには、Scanner を以下のものに接続します...
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
new Scanner(new File("...")) でファイルを読み込みます。
キーボード入力とファイル入力の両方に対して、同じ Scanner メソッド(nextInt, nextLine)が機能します。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
異なるのはソース(System.in vs File)のみです。
完全な行を読み取る
hasNextLine()は次の行が存在するかを検査するが消費せず、nextLine()はその行の残りと行セパレータを消費する。空白行は空文字列""を返すことがある。- 行ベースのレコードについては
while (in.hasNextLine()) { String line = in.nextLine(); ... }を使用せよ。空のレコードが意味があるか、スキップすべきか、無効として報告すべきかを明示的に決定せよ。
テキストファイルの読み込み
プログラムがファイルを読み込む際に行う一連の手順(各行ずつ読み込む処理)に従う。
次に読み込む行があるかどうかを確認するメソッドはどれですか?
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
hasNextLine() は nextLine() の読み込みを守るためのガードとして機能します。
nextLine() を呼び出す前に毎回 hasNextLine() をチェックする必要があります。
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
末尾を超えて読み込むと例外が発生します。
対応するチェック付きトークンを読み取る
- Scanner のデフォルト区切り文字は Programs whitespace である。
hasNext()はトークンの存在を検査し、next()はそれを消費する。hasNextInt()は次のトークンを整数として読み取れるか検査し、nextInt()はその整数を消費する。 while (in.hasNextInt())はoopsで停止し、12 が続いても例外はない。無効なトークンをスキップして後続の整数を保持するポリシーとする場合、hasNext()でループし、hasNextInt()をテストし、next()で無効なトークンを消費せよ。
この完全なプログラムは有効な整数トークンを合計し、スキップされたすべてのトークンを報告します。oops に続き 12 が含まれるファイルに対しては、Skipped: oops を印刷した後に Total: 12 を印刷します。この例では、合計値が int に収まると仮定しています。
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ReadScores {
public static void main(String[] args) throws FileNotFoundException {
int total = 0;
try (Scanner in = new Scanner(new File("scores.txt"))) {
while (in.hasNext()) {
if (in.hasNextInt()) {
total += in.nextInt();
} else {
System.out.println("Skipped: " + in.next());
}
}
}
System.out.println("Total: " + total);
}
}
Match each read to the guard that checks that kind of input.
難易度 2/5 · 140 コイン + 今日初回完了時に小ボーナス付与
A line-presence check is not an integer-format check.
入力を消費してファイルを解放する
- トークンループ内のすべての分岐はトークンを消費する。無効なトークンを消費せずに繰り返し検査すると、Scanner は同一位置に留まり、ループが無限に続く可能性がある。
- try-with-resources ブロックは終了時、例外による終了時を含めてこのファイル Scanner を閉じる。手動で管理する場合、完了時に
close()を呼び出す;チェックはリソースの閉じ替えを代替しない。
hasNextLine() に nextInt() を続けた場合、条件に一致するガードにはなりません。非整数トークンが InputMismatchException を引き起こす可能性があり、その結果失敗した整数読み取りにより、トークンは依然として利用可能となります。ファイルの拒否、レコードの報告、またはトークンの明示的なスキップのいずれかを選択してください。
ファイルの読み込みが終わったら、以下を行うべきです...
難易度 1/5 · 100 コイン + 今日初回完了時に小ボーナス付与
in.close() でファイルリソースを解放します。
ループ前にデータポリシーを確認する
- 入力
8 oops 12に対して、hasNextInt()が成立する間のみ読み込むループは 8 を合計し、oopsで停止します。示された「スキップ・リポート」ポリシーでは 20 を合計します。予期せぬトークン出现的并不意味着文件已结束。 - これらのポリシーは異なる質問に答えます。学生ごとの必須得点がある場合、不良トークンを無視してスキップするとレコードの整合性が崩れる可能性があります。そのため、後のすべてのトークンを同等の得点として扱うのではなく、該当レコードを報告して除外することをお勧めします。
ファイル形式に基づき、行単位読み取りかトークン単位読み取りかを選択します。チェックは消費せずに次の入力をęd사합니다; 一致する読み取りはこれを消費します。無効なデータは明示的に処理し、ループの各分岐で進行させ、ファイルリーダーを閉じます。
入力 8 oops 12 に対して、示された skip-and-report プログラムは合計何を表示するか?
難易度 2/5 · 140 コイン + 今日初回完了時に小ボーナス付与
8 を消費して加算し、oops を消費して報告し、次に 12 を消費して加算する。合計は 20 である。