ファイル操作と入出力、クラスの調べ方3

<概要>ファイル操作の復習。お疲れさまでしたの最終章!

例題18-3-1 ファイル中に特定の文字列を含んでいるかどうかを調べる。

○プログラム

import java.io.*;

public class FindFile1{
  public static void main(String[] args){
    if(args.length!=2){
      System.out.println("使用法:java FindFile1 検索文字列 検索対象ファイル");
      System.out.println("例:java FindFile1 System FindFile1.java");
      System.exit(0);
    }
    String findstring=args[0];
    String filename=args[1];
    try{
      String line;
      int linenum=1;
      BufferedReader reader=new BufferedReader(new FileReader(filename));
      while((line=reader.readLine())!=null){
        int n=line.indexOf(findstring);
        if(n>=0){
          System.out.println(linenum+":"+line);
        }
        linenum++;
      }
      reader.close();
    }catch(FileNotFoundException e){
      System.out.println(filename+"が見つかりません。");
    }catch(IOException e){
      System.out.println(e);
    }
  }
}


○実行例

D:\atsushi\Java\ListA18-1>java FindFile1 System FindFile1.java
6: System.out.println("使用法:java FindFile1 検索文字列 検索対象ファイル");
7: System.out.println("例:java FindFile1 System FindFile1.java");
8: System.exit(0);
19: System.out.println(linenum+":"+line);
25: System.out.println(filename+"が見つかりません。");
27: System.out.println(e);

D:\atsushi\Java\ListA18-1>

○解説

例題7-3-3 とよく似ているので分かりますね。

public int indexOf(String str)  //String クラス ← java.lang パッケージ
 この文字列内で、指定された部分文字列が最初に出現する位置のインデックスを返します。
パラメータ: str - 任意の文字列
戻り値: 文字列引数がこのオブジェクト内の部分文字列である場合は、
 該当する最初の部分文字列の最初の文字のインデックス。
 部分文字列がない場合は -1
例外: NullPointerException - str が null の場合

例題18-3-2 指定したファイルに1000より小さい素数全てを書き込む。

○プログラム

import java.io.*;

public class Prime1{
  static final int MAX_PRIME=1000;
  public static void main(String[] args){
    if(args.length!=1){
      System.out.println("使用法:java Prime1 作成ファイル");
      System.out.println("例:java Prime1 prime.txt");
      System.exit(0);
    }
    String filename=args[0];
    try{
      PrintWriter writer=new PrintWriter(new BufferedWriter(new FileWriter(filename)));
      writePrime(writer);
      writer.close();
    }catch(FileNotFoundException e){
      System.out.println(filename+"が見つかりません。");
    }catch(IOException e){
      System.out.println(e);
    }
  }
  public static void writePrime(PrintWriter writer){
    boolean[] prime=new boolean[MAX_PRIME];
    for(int n=0;n<MAX_PRIME;n++){
      prime[n]=true;
    }
    prime[0]=false;
    prime[1]=false;
    for(int n=0;n<MAX_PRIME;n++){
      if(prime[n]){
        writer.println(n);
        for(int i=2;i*n<MAX_PRIME;i++){
          prime[i*n]=false;
        }
      }
    }
  }
}


○実行例

D:\atsushi\Java\ListA18-2>java Prime1 prime.txt

D:\atsushi\Java\ListA18-2>

○ prime.txt

2
3
5
7
11
……省略……
971
977
983
991
997

○解説

このプログラムの肝は素数を探し、ファイルに書き込むことです。
それらの処理を担当しているのが writePrime メソッドになります。

それでは、writePrime メソッドのプログラムを見てきましょう。
boolean 型配列 prime は、true なら素数、false なら非素数であることを表しています。
とりあえず全てを素数と見なす為に true を代入します。
ここから、どんどん非素数に false を代入していくことになります。
まず、0 と 1 は非素数ですから false を代入しましょう。
次に、2 は true (素数)なのでファイルに書き込みます。
2 の倍数は非素数なので false にします。
3 は true (素数)なのでファイルに書き込みます。
3 の倍数は非素数なので false にします。
4 は false (非素数)なので何もしません。
4 は 2 の倍数として false にしましたね。
後はこの繰り返しです。

*=*=*=*=*=*=*=*=*=*= 最後に *=*=*=*=*=*=*=*=*=*=

お疲れさまでした。
そして、最後まで読んでいただきありがとうございました。
これでJava言語入門講座は終わりになります。

皆さんはJava言語どう思いました?
私は、C++言語より簡単かな?
でも実力はC++言語の方が上かな?
なーんて思いましたよ。
しかし、得意分野が異なるので、共存していくのでしょうね。

質問は掲示板へどうぞ。
間違い指摘、ご要望も歓迎致しますm(_ _)m。


戻る / ホーム