Java初心者です。ファイルの入出力を使ったロジック組みで行き詰っており、ご教授いただきたいです。以下のソースで①の条件式は問題なく通るのですが、②の条件式へ行くと落ちてしまいます。
デバックでファイル読み込みまでは確認できているのですが、落ちる要因がわかりません。
よろしくお願いします
public static void main(String[] args) throws Exception {
File filePath = new File(args[0]);
File[] filelist = filePath.listFiles();
File a= new File(args[0], "branch.lst");
File b= new File(args[0], "commodity.lst");
if (!a.isFile()) {
System.out.println("ファイルが存在しません");
return;
} if (!b.isFile()){
System.out.println("ファイルが存在しません");
return;
}
LinkedHashMap<String, String> branchlist = new LinkedHashMap<String, String>();
LinkedHashMap<String, String> commoditylist = new LinkedHashMap<String, String();
// 変数定義
String branchLine = null;
String commoDityLine = null;
// ファイル読み込み
BufferedReader branchBr = new BufferedReader(new FileReader(a));
BufferedReader commoDityBr = new BufferedReader(new FileReader(b));
①
if(branchBr.ready()){
while ((branchLine = branchBr.readLine()) != null) {
String[] branchCode = branchLine.split(",");
if (!(branchCode[0].matches("^\\d{3}") || (branchCode[1].matches(".+支店")))) {
System.out.println("フォーマットが不正です");
return;
}
branchlist.put(branchCode[0], branchCode[1]);
}
}
②
if(commoDityBr.ready()){
while ((commoDityLine = commoDityBr.readLine()) != null) {
String[] commoDityCode = commoDityLine.split(",");
if (!(commoDityCode[0].matches("[a-zA-Z0-9]{8}") || (commoDityCode[1].matches("[a-zA-Za-zA-Z]+")))) {
System.out.println("フォーマットが不正です");
return;
}
commoditylist.put(commoDityCode[0], commoDityCode[1]);
}
}
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
>if(commoDityBr.ready()処理に入って一行ずつファイルを読み込み後
成る程。ではこのifは変ですね。
readyはバッファ上の読み込み済みデータの有無を返すので
こんなところで使っては駄目です。
No.4
- 回答日時:
if(branchBr.ready()){
や
if(commoDityBr.ready()){
を、どのような目的で使っているのでしょうか?
おそらく、読み込み可能なら処理をして、読み込み不可能なら何もしない、というものだと推測します。
APIのドキュメントには、
http://docs.oracle.com/javase/jp/8/docs/api/java …
>このストリームが読込み可能かどうかを判定します。
と書かれていますので、この目的に使えるように思うかもしれません。
しかし、「戻り値:」のところには、
>次のread()が入力をブロックしないことが確実な場合はtrue、そうでない場合はfalse。
と書かれています。
この意味は、「バッファに読み込み済みのものが残っていればtrue、バッファが空で入力元から読み込まなければいけないときはfalse」というものです。
例えばハードディスクに保存されたファイルを読み込む場合は、falseのときの意味は、「ハードディスクにアクセスして読み込まなければならないので時間がかかる(ブロックする)かも知れませんよ」という程度のものです。時間がかかるかも知れないというだけで、falseだからといって読み込みができないというものではありません。
それに対して、trueのときの意味は「read()だったら、待たずに(ブロックしないで)値が取得できます」をいうものです。
read()は1文字だけ取得するメソッドですので、readLine()やread(char[] cbuf, int off, int len)など複数文字を取得するメソッドを呼び出した場合は、ready()がtrueでも、バッファに読み込み済みのものだけでは足りない場合は、ブロックされる可能性があります。
ready()がどうなるかは、ほとんどの場合は気にする必要のないものだと思います。
気にする必要があるのは、入力元が非常に時間がかかるような場合や、少しの遅延でも問題になるような場合です。
ということで、この質問のコードの場合、
if(branchBr.ready()){
や
if(commoDityBr.ready()){
は、必要ないと思います。
①がtrueで②がfalseになったのは、そのとき、たまたまバッファが空だったかどうかの違いだけだと思います。
No.3
- 回答日時:
通常「落ちる」というと、異常な状態でシステムやプログラムが途中停止することを言います。
Javaなら、例外でエラーになってスタック等のメッセージが表示されて終了、というような時に使います。
今回のような場合には使うことはまずありません。
注意しましょう。
https://docs.oracle.com/javase/jp/6/api/java/io/ …
> false が返されても、次の読み込みが確実にブロックするというわけでない
また、「BufferedReader ready」で検索しても、期待通りにready=trueにならない、というのがいくつも見つかります。
No.1
- 回答日時:
> 落ちてしまいます。
具体的にどんな状態になるのですか?
エラーメッセージとかは出てないのですか?
そんな「具体的にどのような状態になっているか」が、自分で解決するにせよ、人に頼むにせよ、とても重要なヒントになります。
String[] commoDityCode = commoDityLine.split(",");
で 元が , で区切られていない→ commoDityCode[1] がout of bounds になっている、とか無いですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- Java java final 1 2022/06/10 22:49
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
BOOL値を逆にしたい
-
getStringの値がNULLの時の処理
-
eclipseでoracle接続時のエラー...
-
Java配列でNullPointerExceptio...
-
C# ListBoxのインデックスの値...
-
HashMapがおかしい
-
逆コンパイルの見方について(...
-
逆コンパイルの見方について(...
-
postgresql接続時
-
配列にnullを代入すると、null...
-
Javascriptで二つ以上の命令
-
C言語のポインターに関する警告
-
ループ処理の際、最後だけ","を...
-
[JAVA]try 内の変数を外で!?
-
JSPやサーブレットでSystem.out...
-
VBAで配列の計算
-
javaで質問です。 文字列2023/2...
-
ダブルクォーテーションのrepla...
-
Path型をString型へ変換する(Java)
-
System.err. printlnとSystem.o...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ORA-01858: 数値を指定する箇所...
-
配列にnullを代入すると、null...
-
Java配列でNullPointerExceptio...
-
BOOL値を逆にしたい
-
getStringの値がNULLの時の処理
-
C# ListBoxのインデックスの値...
-
eclipseでoracle接続時のエラー...
-
例外でBeanUtils.populateが、...
-
jsp/Servletの動的に増えるフォ...
-
Stringを返す getText()メソッ...
-
gas カレンダー祭日設定でエラー
-
JSPでの画面表示の方法
-
空欄のテキストフィールドの判...
-
C#でラジオボタンとコンボボッ...
-
JSPで複数のSQL実行につ...
-
逆コンパイルの見方について(...
-
Safari ダウンロード時に日本語...
-
java DAO 日付指定フォーマット...
-
oracle10g java jdbc 大量inser...
-
MySQLのテーブル名を変数に置い...
おすすめ情報