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

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

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

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

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

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

Q&A

0回答

546閲覧

追記したファイルの中身を表示したい。

退会済みユーザー

退会済みユーザー

総合スコア0

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

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

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

0グッド

0クリップ

投稿2021/05/26 07:20

編集2021/05/26 09:25

前提・実現したいこと

現在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は書き換えることができないと指示されています。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/05/26 09:02

やってほしいことだけを丸投げした質問で申し訳ございませんでした。試したことを追加で書きましたので、よろしければ回答お願いします。
YT0014

2021/05/26 09:53

追記された「試したこと」ですが、根拠を示していない憶測の記述にしかなっておりません。これでは、丸投げの解消とは言えないかと。 そもそも、「SampleSuperClassは書き換えることができない」とのことなので、当該クラスの処理は必要十分な機能があると考えるべきでしょう。
YT0014

2021/05/26 10:04

該当のファイルの内容をご提示ください。 開発/実行環境を、バージョンも含め、ご提示ください。 実際の実行手順、及び、その際の出力を、正確にご提示ください。 「二つ入力された場合はファイルの中身が表示されません。」とありますが、これは、ファイルの中身が一切表示されない、ということでしょうか? それとも、追記したはずの文章が表示されない、ということでしょうか?
hoshi-takanori

2021/05/26 16:33

System.out.println(result.get(0)); って何行表示してますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問