
[技術講座]
いままでの復習を兼ねて簡単なダウンロードスクリプトを書いてみる。
import("java.io.*");
import("java.net.*");
EOF=-1;      
/**cat (inputSteram , outputSteram)で
inputの内容をoutputに書き込む
同じことはPnutsで用意されている関数read(in,out)でもできる
 */
function cat(in , out) {
    bout= BufferedOutputStream(out);
    while( (c = in.read()) != EOF ) {
        bout.write(c);
    }
    bout.flush();
}
/**
urlStrの内容はhttps://からはじめてください。
download(urlStr, fileName)
 */
function download(urlStr, fileName){
    
    //proxyを使うとき
    //urlObj=URL("http" , "your.proxy.server.name", 8080 ,urlStr); 
    
    urlObj=URL(urlStr);  //java.net.URLの作成
        
    println(urlObj);
    in = urlObj.openStream(); 
    
    out = FileOutputStream(File(fileName));
    cat(in, out); //inの内容をoutに書き込む
    
    out.close();
    in.close();
}
>load("downloader.pnut")
function download(urlStr,fileName)
> download("https://www.ogis-ri.co.jp","sample.html")
https://www.ogis-ri.co.jp
null
>
//ここでsample.htmlというファイルにURLで示したHTMLがセーブされる
上記スクリプトではjava.net.URLクラスを利用して,指定したURL上のHtmlをダウンロードする。(大体同じような内容のスクリプトが、Pntusの配布パッケージのサンプルの中にも含まれている。) Pnutsの基本的な機能とJavaのAPIのみを使ってるので、ほとんどの環境(JDK1.1相当以上)で動作するはずである。
ポイントは、
System::setProperty)
URL() , FileOutputStream())
といったところ。
もう一点。本当はPnutsでは行末の;は必要ない。ただし入れてもよい。(好き好きということ)
先程のスクリプトをJavaで書き直してみる。
import java.io.*;
import java.net.*;
public class Downloader {
    public static final int EOF=-1;
    /**
    cat (inputSteram , outputSteram)でinputの内容をoutputに書き込む
    */
    public void cat(InputStream in , OutputStream out) throws IOException {
        BufferedOutputStream bout= new BufferedOutputStream(out);
        int c;
        while( (c = in.read()) != EOF ) {
            bout.write(c);
        }
        bout.flush();
    }
      
    /** 
    urlStrの内容はhttps://からはじめてください。
    download(urlStr, fileName)
    */
    public void  download(String urlStr, String  fileName){
        try {
            URL urlObj=new URL(urlStr); 
            InputStream in = urlObj.openStream(); 
            OutputStream out =new  FileOutputStream(new File(fileName));
            cat(in, out); 
            out.close();
            in.close();
        } catch (Exception e ) { //楽してます。ごめんなさい
            e.printStackTrace();
        }
    }
    public static void main(String[]  args) {
        if(args.length==2){
            Downloader d = new Downloader();
            d.download(args[0],args[1]);
            
        }
    }
}
かなり適当に書いているがちょっと面倒。そもそもこの程度の作業を行うのにわざわざクラスを定義する必要性がないような気がする。
単純に「こういうことがしたい!」という要求を満たすプログラムを記述するときに、Javaでは必ずクラスを記述して、メソッドを記述してXXXXというステップを踏まなければならない。一方Pnutsではやりたいことを直接記述できる。Pnutsのコードは、実際動作してくれる擬似コードを書いているような感覚で気軽に書くことができる。
また今回の例ではPnutsの処理系が提供してくれている関数を(意図的に)あまりつかっていない。これらの関数を使えばさらに楽にプログラムを作成することができる。
あとで再利用性が必要になってきて、クラスを定義したくなった場合はどうすればよいか。そういうときは、あらためて必要なクラスを定義すればよい。今回の例のようにPnutsスクリプトからJavaに落とす作業は(メソッド内部のロジック部分は基本的に一緒なので)簡単である。
Pnutsを日常的に使っているとPnutsでプロトタイプを作ってからJavaで実装というスタイルが自然に生まれるかもしれない。例えば今回筆者が原稿を書く際には、プロキシを使った際のURLオブジェクトの生成に関する部分が(ドキュメントが少ないため)理解しづらかったが、Pnuts上でトライアンドエラーで試しているうちに使いかたを理解することができた。
| © 2001 OGIS-RI Co., Ltd. | 
 |