2005年9月27日火曜日

プログラミング言語の比較(4回目)

★JAVAで作成2(nioパッケージ利用)

JAVAではバージョン1.4から、NIOパッケージ(New I/O)が加えられました。
以下のプログラムは、その機能を利用したバージョンです。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;

public class CopyByJava2 {
  public void execute(String src, String dest) throws IOException {
    FileInputStream in = null;
    FileOutputStream out = null;
    try {
      // ファイルのオープン
      in = new FileInputStream(src);
      out = new FileOutputStream(dest);

      // コピー準備
      FileChannel cIn = in.getChannel();
      FileChannel cOut = out.getChannel();

      // コピー実行
      cIn.transferTo(0, cIn.size(), cOut);
    }
    finally {
      // ファイルクローズ
      try {
        if(in != null) {
          in.close();
        }
      }
      catch(IOException e) {
      }
      try {
        if(out != null) {
          out.close();
        }
      }
      catch(IOException e) {
      }
    }
  }

  public static void main(String[] args) {
    if(args.length < 2) {
      System.out.println("java CopyByJava2 [コピー元ファイルパス] [コピー先ファイルパス]");
      return;
    }
    else if(args[0].equals(args[1])) {
      System.out.println("コピー元とコピー先が同じです。");
      return;
    }

    long start = System.currentTimeMillis();
    try {
      new CopyByJava2().execute(args[0], args[1]);
    }
    catch(IOException e) {
      e.printStackTrace();
      return;
    }
    long end = System.currentTimeMillis();
    System.out.println((end - start)/1000.0 + " 秒経過");
  }
}

JAVA(ioパッケージ利用)と殆ど同じですが、FileChannelクラスが登場しています。
このFileChannelクラスはNIOで提供される機能の一つです。そして、NIOは主に(速度的な)パフォーマンスを上げる事を目的に導入されました。
実際にパフォーマンス上の利点があるのでしょうか?その事を調べる目的も込めて比較対象に加えています。

次回は、これまでに挙げた4種類のプログラムを使用して、実際に測定をしてみましょう。