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

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

ただいまの
回答率

90.51%

  • Java

    13786questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 565

han-

score 5

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

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

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

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

import java.io.*;

class Jfind{

    public static int i = 0;
    public static String[] searchLine= new String[100];

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

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        System.out.println("検索する文字列の数を入力してください");
        String kazu = br.readLine();
        int iKazu = Integer.parseInt(kazu);

        String[] search = new String[iKazu];
        System.out.println("検索する文字列を入力してください");
        for(int a=0;a<iKazu;a++){
            search[a] = br.readLine();
        }

        while(true){

            try{
                System.out.println("読み込むファイル名を入力してください");
                String fileName = br.readLine();
                BufferedReader br2 = new BufferedReader(new FileReader(fileName+".txt"));

                String gyo;
                int j = 0;
                String[] mojiLine = new String[100];

                while((mojiLine[j] = br2.readLine()) !=null){
                    for(int b=0;b<iKazu;b++){
                        if(mojiLine[j].indexOf(search[b])!=-1){
                            gyo = String.valueOf(j+1);  
                            inputsearchLine("行番号:"+gyo+" "+mojiLine[j]);
                            i++;
                            b++;
                        }
                    }
                    j++;
                }
                br2.close();
                break;

            }catch( FileNotFoundException e){
                    System.out.println("読み込みエラー");

            }              
        }
        for(int k=0;k<i;k++){
            System.out.println(searchLine[k]);
        }
    }
    public static void inputsearchLine(String str){
        searchLine[i] = str;
    }
}
class JfindFw extends Jfind{

    JfindFw(){

    }
    public static void main(String args[])throws IOException{
        Jfind obj = new Jfind();

        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();   
    }
}
C:\work\exercise>java Jfind
検索する文字列の数を入力してください
2
検索する文字列を入力してください
a
b
読み込むファイル名を入力してください
test
行番号:1 ccccca
行番号:2 aaaaaaaaaaaaaaaaaaaaaaA
行番号:3 bbbbbbbbbbbbbbbbbbBa

C:\work\exercise>java JfindFw
書き込むファイル名を入力してください
outTest

C:\work\exercise>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

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 11: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 12:25

    SuperClassName.main(args) ね

    キャンセル

  • 2017/09/12 13:13

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

    キャンセル

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    社員情報のプログラム

    社員情報のプログラム (JAVA) プログラの機能 (1)社員情報の追加 入力項目としては、社員番号、氏名(性、名)、生年月日(年、月、日) (3)で読み込んだ情報を追加する仕

  • 解決済

    100になる直前の加算結果出力

    javaで開始値と終了値を入力してその間の偶数を加算していき、合計が100を超えたら「数値が100を超えたため、処理を中止します。」とメッセージを出し、かつ合計が100になる前の加

  • 解決済

    フォルダの中にあるファイルを1つずつ読み込む

    最近Javaで開発を始めました。 複数のファイルが入っているフォルダがあります。 このフォルダから1ファイルずつ開き中身をバッファか配列に読み込むコードを書きたいです。

  • 解決済

    javaでデータを読み込んでソートしたいのですがうまく来ません

    コンパイルするとエラーになって 「シンボルが見つかりません」と表示されます。 他にも問題があれば教えてください import java.io.File; import

  • 解決済

    会員情報システム(Java)での作り方

    javaで会員情報システムのようなものを作りたいです。 下記の実行結果(コマンドプロンプトで実行)になるような、登録プログラムを作成したいのですが、作成方法が分かりませんので、教

  • 受付中

    3つの整数が

    public class Main { public static void main(String[] args) throws Exception { //3つの整数が入力

  • 受付中

    問題

    //1行目に整数が入力されるので //その整数の回数分標準入力から数値を受け取り //3足したものを改行区切りで出力して下さい。 BufferedReader br = ne

同じタグがついた質問を見る

  • Java

    13786questions

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