ファイル操作と入出力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 を代入していけば、true のまま残ったものが素数ということになります。
ちょっと注意して欲しいのは数値は配列に格納されているんじゃなくて、
その添字なんだ、ってことをよーく理解して下さい。
つまり、配列要素が true の配列の添字を素数であるとしてファイルに書き込むのです。

それでは、流れに沿って解説しましょう。
先ず 0 と 1 が非素数なのは考えるまでもありませんから手動で false を代入しちゃいましょう。
次に 2 は true なのでファイルに書き込みます。
実はここでも 2 は素数であるということが大前提として使われています。
そして、2 の倍数(2倍、3倍、4倍……)は非素数なので false にします。
3 は true なのでファイルに書き込みます。
3 の倍数は非素数なので false にします。
4 は false なので何もしません。
4 は 2 の倍数として false にしましたね。
後はこの繰り返しです。


戻る / ホーム