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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Java

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

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Q&A

解決済

1回答

11069閲覧

ファイルOPEN、CLOSEについて

lena

総合スコア31

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Java

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

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

0グッド

0クリップ

投稿2016/03/21 11:54

java初心者です。
前回入力ファイルをもとに計算Cと判定マスタMを使用して入力ファイルの値をoutA.csv、outB.csvに
出力するプログラムを作成しました。
そのプログラムに関係するご質問と対処法を教えていただけないでしょうか。
よろしくお願いいたします。

【質問内容】
①finally句にファイルcloseを指定しているにも関わらずinM.csvとinC.csvが閉じられておらず、
ファイルの編集が出来ません。
デバックで確認したところcloseされているように思われるのですがどうしてなのでしょうか?
②複数の入力、出力ファイルについて、ファイルopenは全て一番最初、同じ場所にするのが良いのでしょうか?
ファイルcloseはすべての処理が終わるmainメソッド終了タグの手前にまとめて書くのが良いのでしょうか?
【問題点】
①inM.csvファイルが空の場合エラー表示して通常終了したいのですが次の処理に進んでしまいます。

【仕様内容】
入力ファイルの数値をキーとして計算Cを読込みます。
読込んだ計算Cの値で入力ファイルの数値を除算します。

除算した結果が偶数の場合、判定Mの「002」を読込みます。
判定Mの値が「○」の場合、outAに入力ファイルの値を出力し、
「×」の場合は、outBに入力ファイルの値を出力します。

除算した結果が奇数の場合、判定Mの「001」を読込みます。
判定Mの値が「○」の場合、outAに入力ファイルの値を出力し、
「×」の場合は、outBに入力ファイルの値を出力します。

入力file 計算C 判定M キー 値 10 キー 値 奇数 001,× 9 1,2 偶数 002,○ 8 2,3 7 3,1 6 4,2 5 5,3 4 6,1 3 7,2 2 8,3 1 9,1 10,2 【実現したい出力例】 outA.csv outB.csv 6 10 4 9 8 7 5 3 2 1
package test5; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.util.ArrayList; public class JudgementValue { public static void main(String[] args) { BufferedReader brA = null; //inA Inputファイル入力用 BufferedReader brC = null; //inC 計算ファイル入力用 BufferedReader brM = null; //inM 判定マスタファイル入力用 BufferedWriter bwA = null ; //outAファイル出力用 BufferedWriter bwB = null ; //outBファイル出力用 String stA = ""; //inAファイルデータを格納 String stC = ""; //inCファイルデータを格納 String stM = ""; //inMファイルデータを格納 ArrayList<String[]> alMaster = new ArrayList<String[]>(); //判定マスタ ArrayList<String[]> alCalc = new ArrayList<String[]>(); //計算C String[][] masterM = null ; //判定マスタ用 String[][] numC = null ; //計算C用 double quotient = 0; //除算の商い結果 boolean emptyflgM = true; //inM判定マスタファイル空判定フラグ boolean emptyflgC = true; //inC計算Cファイル空判定フラグ boolean emptyflgA= true; //inA入力ファイル空判定フラグ try{ brC = new BufferedReader(new InputStreamReader(new FileInputStream("C:/Users/temp/Desktop/inC.csv"),"JISAutoDetect")); }catch(FileNotFoundException e){ System.err.println("inC.csvファイルが見つかりません。"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } try{ brM = new BufferedReader(new InputStreamReader(new FileInputStream("C:/Users/temp/Desktop/inM.csv"),"JISAutoDetect")); }catch(FileNotFoundException e){ System.err.println("inM.csvファイルが見つかりません。"); }catch (UnsupportedEncodingException e) { e.printStackTrace(); } fileError1: //inMファイルデータを読み込み try { while((stM = brM.readLine()) != null){ emptyflgM = false; if(stM.equals("")){ System.err.println("データに不備があります。"); break fileError1; } alMaster.add(stM.split(",")); /* ArrayListへ読み込み */ } if(emptyflgM){ System.err.println("inM.csvファイルは空です。"); break fileError1; } masterM = new String[alMaster.size()][]; for (int i = 0; i < alMaster.size(); i++) { masterM[i] = alMaster.get(i); /* ArrayListから配列へ格納 */ } //inCファイルデータを読み込み while((stC = brC.readLine()) != null){ emptyflgC = false; if(stC.equals("")){ System.err.println("データに不備があります。"); break fileError1; } alCalc.add(stC.split(",")); /* ArrayListへ読み込み */ } if(emptyflgC){ System.err.println("inC.csvファイルは空です。"); break fileError1; } numC = new String[alCalc.size()][]; for (int i = 0; i < alCalc.size(); i++) { numC[i] = alCalc.get(i); /* ArrayListから配列へ格納 */ if (!isHanNum(numC[i][0]) || !isHanNum(numC[i][1])) { System.err.println("数値以外のものが含まれています。"); break fileError1; } } } catch(IOException e){ System.err.println("エラーが発生しました。"); e.printStackTrace(); }finally{ try { if(brM != null){ brM.close(); } if(brC != null){ brC.close(); } }catch (IOException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } }//finally try{ brA = new BufferedReader(new InputStreamReader(new FileInputStream("C:/Users/temp/Desktop/inA.csv"),"JISAutoDetect")); }catch(FileNotFoundException e){ System.err.println("inA.csvファイルが見つかりません。"); }catch (UnsupportedEncodingException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } try{ bwA = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:/Users/temp/Desktop/outA.csv"),"SJIS")); }catch(FileNotFoundException e){ System.err.println("outA.csvファイルが見つかりません。"); }catch (UnsupportedEncodingException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } try{ bwB = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:/Users/temp/Desktop/outB.csv"),"SJIS")); }catch(FileNotFoundException e){ System.err.println("outB.csvファイルが見つかりません。"); }catch (UnsupportedEncodingException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } fileError2: try{ //inAファイルデータを読み込み while((stA = brA.readLine()) != null){ emptyflgA = false; if(stA.equals("")){ System.err.println("データに不備があります。"); break fileError2; } if(isHanNum(stA) == false){ System.err.println("数値以外のものが含まれています。"); break fileError2; } for (int i = 0; i < numC.length; i++) { if(stA.equals(numC[i][0])){ //入力の値と計算Cのキーの値の一致確認 quotient= Double.valueOf(stA) / Double.valueOf(numC[i][1]); if(quotient % 2 == 0){ //偶数かどうかを確認 if(masterM[1][1].equals("○")){ bwA.write(stA); bwA.newLine(); System.out.println("1番目:" + stA); }else{ bwB.write(stA); bwB.newLine(); System.out.println("2番目:" + stA); } }else{ if(masterM[0][1].equals("○")){ bwA.write(stA); bwA.newLine(); System.out.println("3番目:" + stA); }else{ bwB.write(stA); bwB.newLine(); System.out.println("4番目:" + stA); } } } } //for quotient = 0; //除算の商い結果を0にリセット } //while if(emptyflgA){ System.err.println("inA.csvファイルは空です。"); break fileError2; } }catch(IOException e){ System.err.println("エラーが発生しました。"); e.printStackTrace(); }finally{ try { if(brA != null){ brA.close(); } if(bwA != null){ bwA.close(); } if(bwB != null){ bwB.close(); } }catch (IOException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } }//finally }//main /** * 半角数値チェック * @param s 文字列 * @return true 正常 false エラー */ public static boolean isHanNum(String s){ try{ Double.parseDouble(s); return true; }catch(Exception e){ return false; } } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

【質問内容】
①finally句にファイルcloseを指定しているにも関わらずinM.csvとinC.csvが閉じられておらず、
ファイルの編集が出来ません。
デバックで確認したところcloseされているように思われるのですがどうしてなのでしょうか?

他のデバッグ中のプロセスが、ステップ実行で停止したままになっていたりして、
残っていたりしませんか?

②複数の入力、出力ファイルについて、ファイルopenは全て一番最初、同じ場所にするのが良いのでしょうか?
ファイルcloseはすべての処理が終わるmainメソッド終了タグの手前にまとめて書くのが良いのでしょうか?

同時にファイルを開く数は少ない方が良いです。
使い終わったらさっさと閉じましょう。

【問題点】
①inM.csvファイルが空の場合エラー表示して通常終了したいのですが次の処理に進んでしまいます。

エラー処理にbreakを使うのはお勧めできません。
JavaではGOTO ERROR1:のようなことはせず、エラーの場合は例外をスローして対処します。
この場合は、throw new IOException("(エラーメッセージ)");のように例外を投げて、処理を中断してしまった方が良いと思います。

他の箇所でも、例外をいちいちcatchせず、まとめてしまうとスッキリします。
まとめたcatch文では、e.getMessage()を出力すればどんなエラーなのかがだいたい分かります。

...

質問と直接は関係ありませんが、いくつかアドバイスを。

メソッドを分割したり、冗長な処理は削っておくほうが混乱を避けられます。

メソッドの最初に変数を宣言するのも良くないです。
BufferedReaderなんかは使うときに初めて宣言するほうが良いです。

あと参考までに、Java7以降ではtry-with-resourcesという言語機能が追加され、下記のようにcloseを直接書かなくても良くなっています。

lang

1 2try (BufferedReader brC = new BufferedReader(new InputStreamReader(new FileInputStream("C:/Users/temp/Desktop/inC.csv"),"JISAutoDetect"))) { 3 // 4} 5 6// 下記の処理が要らない 7// finally { 8// if(brC != null){ 9// brC.close(); 10// } 11// }

(2016/03/22 00:21のコメントに対する追記)

「デバックで確認」とありましたので、そのデバッグのプロセスが残っているのではないかと推測しました。
Javaプロセスが終了していれば、ファイルをクローズしているかどうかにかかわらず、ファイルがつかみっぱなしになることはないはずです。

エラーハンドリングの例は、
ひとつはUnsupportedEncodingExceptionなんかは、catchせずに、
public static void main(String[] args) throws UnsupportedEncodingException {
のようにしてmainメソッドの外に投げてしまえば、
処理の中断にもなるし、エラー処理を詳細に記述しなくて済みます。

もしくは、

lang

1try { 2 try (BufferedReader brC = new BufferedReader(new InputStreamReader( 3 new FileInputStream("C:/Users/temp/Desktop/inC.csv"),"JISAutoDetect"))) { 4 // inC.csvの処理 5 } 6 try (BufferedReader brM = new BufferedReader(new InputStreamReader( 7 new FileInputStream("C:/Users/temp/Desktop/inM.csv"),"JISAutoDetect"))) { 8 // inM.csvの処理 9 } 10 try (BufferedReader brA = new BufferedReader(new InputStreamReader( 11 new FileInputStream("C:/Users/temp/Desktop/inA.csv"),"JISAutoDetect"))) { 12 // inA.csvの処理 13 } 14} catch(IOException e) { 15 System.err.println("エラー: " + e); 16}

のようにして、例外が発生したら外側のcatchに飛んで、ただちに処理が中断するようにします。
IOExceptionFileNotFoundExceptionを兼ねますので、一番外側でIOExceptionをcatchするだけで良いです。
その場合、エラーメッセージは詳細には設定できませんが、その代わりにメインの処理に集中できます。
またはUnsupportedEncodingExceptionと同じように、mainメソッドの外に投げるようにしても良いです。

投稿2016/03/21 13:45

編集2016/03/22 03:06
argius

総合スコア9388

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

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

lena

2016/03/21 15:21

argiusさん、ご回答いただきありがとうございました。 ①の質問についてですが、コンソールは終了となっているので他のデバッグ中のプロセスやステップ実行で停止になってることはないと思われますがいかがでしょうか? エラー処理についてご説明いただいていますが私の理解不足でよく分かりません。 ご面倒かと思いますが記述例を載せていただけると幸いです。
argius

2016/03/22 03:07

回答欄に追記しました。
lena

2016/03/22 13:47

argiusさん、追記回答いただきありがとうございました。 記述例を載せて下さったおかげでどのように例外処理をすれば良いのか理解できました。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問