前提・実現したいこと
現在Java課題の演習問題に取り組んでいます。
コマンドライン引数が2つ入力された場合、第一パラメータがファイルパスで、第二パラメータが文字列を入力します。第一パラメータに入力されたファイルに第二パラメータの文字列を追記して、追記したファイルの中身を表示したいです。
java Main C:¥Sample.txt 追記事項
Sampleテキストファイルの中身追記事項
コマンドプロンプトでこのように表示させたいです。
発生している問題・エラーメッセージ
ファイルパスをセットして追記処理を行っているつもりですが、全くファイルの中身が表示されていない状態です。 どのように訂正すれば追記処理を行ったファイルの中身が表示されますでしょうか。 第一パラメータのみ入力された場合、ファイルの中身が自分の理想通りに表示されるのですが、二つ入力された場合はファイルの中身が表示されません。
試したこと
SampleSuperClassのwriteFileメソッドがboolean型で追記した文字列を格納する場所がないため、入力値が二つある場合の処理ができていないと思うのですが、認識があっていますでしょうか。
該当のソースコード
Java
1// 例外処理を行うためにSampleExceptionクラスをインポート 2import common.SampleException; 3 4public class Main { 5 public static void main(String[] args) { 6 // SubClassをインスタンス化 7 SubClass subClass = new SubClass(); 8 // 例外が発生しうる処理 9 try { 10 // 処理クラスの結果を表示 11 subClass.checkParameter(args); 12 } 13 // SampleExceptionをキャッチ 14 catch(SampleException e) { 15 // エラーメッセージの表示 16 System.out.println(e.getErrorMessage()); 17 } 18 } 19} 20
Java
1// SampleSuperClassを継承するためにインポート 2import common.SampleSuperClass; 3// 例外処理を行うためにSampleExceptionをインポート 4import common.SampleException; 5// ArrayListをインポート 6import java.util.ArrayList; 7 8public class SubClass extends SampleSuperClass { 9 10 // ArrayListをインスタンス化 11 ArrayList<String> result = new ArrayList<String>(); 12 13 public void checkParameter(String[] parameters) throws SampleException { 14 // コマンドライン引数が1個の場合 15 if(parameters.length == 1) { 16 // ファイルパスをセット 17 super.setFilePath(parameters[0]); 18 // ファイルの読み込み 19 super.readFile(); 20 // ArrayListにセット 21 result = super.getFileData(); 22 // ファイルの中身を表示 23 System.out.println(result.get(0)); 24 } 25 // コマンドライン引数が2個の場合 26 else if(parameters.length == 2) { 27 // ファイルパスをセット 28 super.setFilePath(parameters[0]); 29 // コマンドライン引数の第二パラメータをファイルに追記 30 if(super.writeFile(parameters[1])) { 31 ファイルの読み込み 32 super.readFile(); 33 // ArrayListにセット 34 result = super.getFileData(); 35 // ファイルの中身を表示 36 System.out.println(result.get(0)); 37 } 38 } 39 } 40}
Java
1package common; 2import java.io.BufferedReader; 3import java.io.BufferedWriter; 4import java.io.File; 5import java.io.FileReader; 6import java.io.FileWriter; 7import java.io.IOException; 8import java.util.ArrayList; 9import java.util.regex.Matcher; 10import java.util.regex.Pattern; 11 12// 演習問題 No.5のスーパークラス 13public class SampleSuperClass { 14 15 /** ファイル名 */ 16 private String filePath = ""; 17 18 /** ファイル情報 */ 19 private ArrayList<String> fileData = new ArrayList<String>(); 20 21 /** テキストファイル拡張子 */ 22 private final String EXTENSION_TXT = "txt"; 23 24 /** テキストファイル拡張子 */ 25 private final String EXTENSION_CSV = "csv"; 26 27 /** 改行文字列 */ 28 protected final String LINE = "\n"; 29 30 /** パターン:アットマーク */ 31 protected final String PATTERN_ATMARK = ".*@.*"; 32 /** パターン:数値 */ 33 protected final String PATTERN_NUMBER = "[0-9]+"; 34 /** パターン:1または2 */ 35 protected final String PATTERN_DEGITAL = "1|2"; 36 37 /** 38 * ファイル読み込み処理 39 * 40 * @return boolean 処理結果(true:成功、false:失敗) 41 * @throws SampleException 42 */ 43 protected void readFile() throws SampleException { 44 45 //変数宣言 46 ArrayList<String> list = new ArrayList<String>(); 47 BufferedReader br = null; 48 49 try { 50 51 //ファイルオブジェクト生成 52 File file = new File(filePath); 53 54 //ファイルが存在するチェック 55 if (!file.exists()) { 56 57 throw new SampleException("E001"); 58 59 } 60 //ファイルが読み込み可能かどうかチェック 61 if (!file.canRead()) { 62 throw new SampleException("E002"); 63 } 64 65 //入力ストリーム作成 66 br = new BufferedReader(new FileReader(file)); 67 68 //ファイル読み込み 69 while (br.ready()) { 70 //1行つづArrayListに追加 71 list.add(br.readLine()); 72 } 73 74 //メンバ変数にセット 75 fileData = list; 76 77 } catch (IOException e) { 78 throw new SampleException("E003"); 79 } finally { 80 81 if (br != null) { 82 try { 83 br.close(); 84 } catch (IOException e) { 85 throw new SampleException("E004"); 86 } 87 } 88 89 } 90 91 } 92 93 /** 94 * ファイル追記処理 95 * 96 * @return boolean 処理結果(true:成功、false:失敗) 97 * @throws SampleException 98 */ 99 protected boolean writeFile(String str) throws SampleException { 100 101 //変数宣言 102 BufferedWriter bw = null; 103 104 try { 105 106 //ファイルオブジェクト生成 107 File file = new File(filePath); 108 109 //ファイルが存在するチェック 110 if (!file.exists()) { 111 112 throw new SampleException("E001"); 113 114 } 115 //ファイルが書き込み可能かどうかチェック 116 if (!file.canRead()) { 117 throw new SampleException("E005"); 118 } 119 120 //出力ストリーム作成 121 bw = new BufferedWriter(new FileWriter(file, true)); 122 bw.write(str); 123 bw.newLine(); 124 125 } catch (IOException e) { 126 throw new SampleException("E006"); 127 } finally { 128 129 if (bw != null) { 130 try { 131 bw.close(); 132 } catch (IOException e) { 133 throw new SampleException("E004"); 134 } 135 } 136 137 } 138 139 return true; 140 } 141 142 /** 143 * 禁止文字列が含まれているかどうかのチェック 144 * 145 * @param str チェック対象文字列 146 * @param pattrn 禁止文字列パターン 147 * @return 148 */ 149 protected boolean isMatch(String str, String pattrn) { 150 151 //正規表現初期化 152 Pattern pt = Pattern.compile(pattrn); 153 Matcher matcher = pt.matcher(str); 154 155 if (matcher.matches()) { 156 //禁止文字列が含まれている場合 157 return true; 158 159 } 160 161 //禁止文字列が含まれていない場合 162 return false; 163 } 164 165 /** 166 * テキストファイルかどうかのチェック 167 * 168 * @return boolean チェック結果 169 * (true:テキストファイル、false:テキストファイルではない) 170 */ 171 protected boolean isTxtFile() { 172 173 //拡張子チェック 174 if (checkExtension(EXTENSION_TXT, filePath)) { 175 //拡張子が「txt」 176 return true; 177 } 178 179 //拡張子が「txt」以外の場合 180 return false; 181 } 182 183 /** 184 * CSVファイルかどうかのチェック 185 * 186 * @return boolean チェック結果 187 * (true:CSVファイル、false:CSVファイルではない) 188 */ 189 protected boolean isCsvFile() { 190 191 //拡張子チェック 192 if (checkExtension(EXTENSION_CSV, filePath)) { 193 //拡張子が「txt」 194 return true; 195 } 196 197 //拡張子が「txt」以外の場合 198 return false; 199 } 200 201 /** 202 * 拡張子チェック 203 * 204 * @param extension 拡張子 205 * @param path パス文字列 206 * @return boolean チェック結果 207 * (true:拡張子が正しい、false:拡張子が正しくない) 208 */ 209 protected boolean checkExtension(String extension, String path) { 210 211 //パス文字列で最後に「.」が出没する位置を取得 212 int index = path.lastIndexOf("."); 213 214 if (index == -1) { 215 //-1の場合はパス文字列に「.」が存在しない 216 return false; 217 } 218 219 //拡張子文字列を切り出し 220 String str = path.substring(index+1); 221 222 //拡張子判定 223 if (extension.equals(str.toLowerCase())) { 224 return true; 225 } 226 227 return false; 228 229 } 230 231 /** 232 * ファイル情報取得 233 * 234 * @return fileData 235 */ 236 protected ArrayList<String> getFileData() { 237 return fileData; 238 } 239 240 /** 241 * ファイルパス 242 * 243 * @param filePath ファイルパス 244 */ 245 public void setFilePath(String filePath) { 246 this.filePath = filePath; 247 } 248 249 /** 250 * ファイルパス取得 251 * 252 * @return filePath ファイルパス 253 */ 254 protected String getFilePath(){ 255 return this.filePath; 256 } 257 258} 259
補足情報(FW/ツールのバージョンなど)
問題文でSampleSuperClassは書き換えることができないと指示されています。
あなたの回答
tips
プレビュー