プロが教えるわが家の防犯対策術!

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件)

>if(commoDityBr.ready()処理に入って一行ずつファイルを読み込み後



成る程。ではこのifは変ですね。
readyはバッファ上の読み込み済みデータの有無を返すので
こんなところで使っては駄目です。
    • good
    • 0

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になったのは、そのとき、たまたまバッファが空だったかどうかの違いだけだと思います。
    • good
    • 0

通常「落ちる」というと、異常な状態でシステムやプログラムが途中停止することを言います。


Javaなら、例外でエラーになってスタック等のメッセージが表示されて終了、というような時に使います。

今回のような場合には使うことはまずありません。
注意しましょう。


https://docs.oracle.com/javase/jp/6/api/java/io/ …
> false が返されても、次の読み込みが確実にブロックするというわけでない

また、「BufferedReader ready」で検索しても、期待通りにready=trueにならない、というのがいくつも見つかります。
    • good
    • 0

落ちるの意味は例外?



そうならスタックトレースを希望します。
    • good
    • 0
この回答へのお礼

if(commoDityBr.ready()処理に入って一行ずつファイルを読み込み後、フォーマット確認を行いたいのですが
if文を抜けるということです。

お礼日時:2016/11/07 22:10

> 落ちてしまいます。



具体的にどんな状態になるのですか?
エラーメッセージとかは出てないのですか?

そんな「具体的にどのような状態になっているか」が、自分で解決するにせよ、人に頼むにせよ、とても重要なヒントになります。


String[] commoDityCode = commoDityLine.split(",");
で 元が , で区切られていない→ commoDityCode[1] がout of bounds になっている、とか無いですか?
    • good
    • 0
この回答へのお礼

言葉足らずでした。エラーではなく処理すべき内容(if(commoDityBr.ready())がif文を抜けるということです

お礼日時:2016/11/07 22:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!