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

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

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

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

Q&A

解決済

1回答

4656閲覧

javaで指定したテキストファイルの文字を別のファイルに書き込む方法

han-

総合スコア13

Java

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

0グッド

0クリップ

投稿2017/09/11 22:10

継承を使って指定したテキストファイルの文字を別のファイルに書き込むプログラムを作っています。継承の仕組みがあまり理解できておらず、困っています。

スーパークラスの機能:Jfind
・検索する文字列の数、検索する文字列、読み込むテキストファイル名のコンソール入力
・テキストファイル名はオープンできるまで繰り返し入力
・検索して該当した行を行番号付きで配列に格納、表示

サブクラスの機能:JfindFw
・書き込むファイル名をコンソール入力
・スーパークラスで格納した該当行を別のテキストファイルに入力

スーパークラスJfindとサブクラスJfindFwはそれぞれコンパイルできています。
ただ、サブクラスJfindを実行しても書き込むファイルが作成されるだけで中身に該当行の書き込みができていません。

lang

1import java.io.*; 2 3class Jfind{ 4 5 public static int i = 0; 6 public static String[] searchLine= new String[100]; 7 8 public static void main(String args[])throws IOException{ 9 10 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 11 12 System.out.println("検索する文字列の数を入力してください"); 13 String kazu = br.readLine(); 14 int iKazu = Integer.parseInt(kazu); 15 16 String[] search = new String[iKazu]; 17 System.out.println("検索する文字列を入力してください"); 18 for(int a=0;a<iKazu;a++){ 19 search[a] = br.readLine(); 20 } 21 22 while(true){ 23 24 try{ 25 System.out.println("読み込むファイル名を入力してください"); 26 String fileName = br.readLine(); 27 BufferedReader br2 = new BufferedReader(new FileReader(fileName+".txt")); 28 29 String gyo; 30 int j = 0; 31 String[] mojiLine = new String[100]; 32 33 while((mojiLine[j] = br2.readLine()) !=null){ 34 for(int b=0;b<iKazu;b++){ 35 if(mojiLine[j].indexOf(search[b])!=-1){ 36 gyo = String.valueOf(j+1); 37 inputsearchLine("行番号:"+gyo+" "+mojiLine[j]); 38 i++; 39 b++; 40 } 41 } 42 j++; 43 } 44 br2.close(); 45 break; 46 47 }catch( FileNotFoundException e){ 48 System.out.println("読み込みエラー"); 49 50 } 51 } 52 for(int k=0;k<i;k++){ 53 System.out.println(searchLine[k]); 54 } 55 } 56 public static void inputsearchLine(String str){ 57 searchLine[i] = str; 58 } 59} 60class JfindFw extends Jfind{ 61 62 JfindFw(){ 63 64 } 65 public static void main(String args[])throws IOException{ 66 Jfind obj = new Jfind(); 67 68 BufferedReader brOutFile = new BufferedReader(new InputStreamReader(System.in)); 69 70 System.out.println("書き込むファイル名を入力してください"); 71 String outFileName = brOutFile.readLine(); 72 PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(outFileName+".txt"))); 73 74 String[] outMoji = searchLine; 75 for(int x=0;x<i;x++){ 76 pw.println(outMoji[x]); 77 } 78 pw.close(); 79 } 80}

lang

1C:\work\exercise>java Jfind 2検索する文字列の数を入力してください 32 4検索する文字列を入力してください 5a 6b 7読み込むファイル名を入力してください 8test 9行番号:1 ccccca 10行番号:2 aaaaaaaaaaaaaaaaaaaaaaA 11行番号:3 bbbbbbbbbbbbbbbbbbBa 12 13C:\work\exercise>java JfindFw 14書き込むファイル名を入力してください 15outTest 16 17C:\work\exercise> 18

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

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

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

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

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

guest

回答1

0

ベストアンサー

継承すると、親クラスのメソッドやメンバー変数を引き継いだ(継承した)クラス(子クラス)になります。
子クラスで定義したメソッドやメンバー変数は、親クラスから引き継いだメソッドやメンバー変数と同様に使えますが、名前が親クラスと同じメソッドやメンバー変数を定義した場合には、子クラスで定義したものが優先されます。
親クラスのメソッドを使いたいときには"super."(親の)を名前の前に付けます。

質問のコードでは、JfindクラスとJfindFwクラスの両方で

public static void main(String args[])throws IOException

が定義されています。

Jfindを実行するとJfindクラスのmainメソッドが実行されます(当然)
JfindFwを実行するとJfindFwクラスのmainメソッドが実行され、親クラス(Jfind)のmainメソッドは実行されません。

han-さんは、JFindFwを実行すると(JfindFwクラスのmainメソッドの中で)、まずJfindのmainメソッドが実行され、その後でJFindFwのmainメソッドが実行されるようにしたいのだと思います。
だとすれば、JfindFwクラスのmainメソッドの中で、親クラスのmainメソッドを呼び出すようにします。

具体的には、

public static void main(String args[])throws IOException{ // Jfind obj = new Jfind(); /* この行は意味がありません。objという変数は、その後使われていませんから */ super.main(args); /* 親クラスのmainを呼び出します。親クラスのmainメソッドによって、変数 searchLineに値が入ります */ BufferedReader brOutFile = new BufferedReader(new InputStreamReader(System.in)); System.out.println("書き込むファイル名を入力してください"); String outFileName = brOutFile.readLine(); PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(outFileName+".txt"))); String[] outMoji = searchLine; for(int x=0;x<i;x++){ pw.println(outMoji[x]); } pw.close(); }

投稿2017/09/12 01:23

coco_bauer

総合スコア6915

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

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

han-

2017/09/12 02:59

ご指摘いただいたsuperの行を試してみたのですが、 C:\work\exercise>javac Enshu4-2.java Enshu4-2.java:68: エラー: staticでない変数 superをstaticコンテキストから参照することはできません super.main(args); ^ というエラー出ましたので、 Jfind obj = new Jfind(); obj.main(args); としてみるとJfind →JfindFwとなり、完成させることができました! 継承について分かりやすく説明していただき、ありがとうございます! 親クラスのmainメソッドも子クラスで呼び出せることを初めて知りました。
退会済みユーザー

退会済みユーザー

2017/09/12 03:25

SuperClassName.main(args) ね
han-

2017/09/12 04:13

その方法でも動かせることができました! ありがとうございます。 継承した場合は、Jfindをインスタンス化しなくてもよいってことでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問