[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends] Re: UrlDown.java




UrlDown.java ですが、バイナリーファイルをテキストエンコーディングして
しまうというバグがありました。

>UrlDown.java
>==================================================================
>import java.io.*;
>import java.util.*;
>import java.net.*;
>
>public class UrlDown {
>
>  public void urlDown(String urlspeck, String path) {
>    try {
>      URL url = new URL(urlspeck);
>      URLConnection conn = url.openConnection();

ここに、

        System.out.println("TYPE::" + conn.getContentType());//DEBUG
        System.out.println("ENC::" + conn.getContentEncoding());//DEBUG

というデバッグ行を入れてみました。

例えば Windows の .exe ファイルだと、実行結果は

 TYPE::application/octet-stream
 ENC::null

こんなカンジです。

疑惑としては、URLConnecition を new しただけだと、
すべてテキストエンコーディングしてしまうのではないかと思えます。
(JDK 1.2 RC1 Windows 95)

getContentType() などを一度呼んでやる必要があるかも知れません。
(今日は作業が詰まっていて追試できない...)

>      InputStream is = conn.getInputStream();
>      FileWriter out = new FileWriter(path);

FileWriter だとテキストエンコーディングがかかってしまうので、結局

      FileOutputStream out =
        new FileOutputStream(new File(path));

こうなりました。

>      int c = -1;
>      while ((c = is.read()) > -1) {
>        out.write(c);
>      }
>      out.close();
>    }
>    catch (MalformedURLException e) {
>    }
>    catch (IOException e) {
>      System.out.println("ERROR::" + e.getMessage());
>      e.printStackTrace();
>    }
>    catch (Exception e) {
>    }
>  }
>
>  public static void main(String[] args) {
>    UrlDown ud = new UrlDown();
>    try {
>      BufferedReader data = new BufferedReader( new FileReader(args[0]));
>      String line = null;
>      while ((line = data.readLine()) != null) {

ついでですがここに

        if (line.startsWith("#")) { continue; } //1998.12.9 y.e comment行の処理

を追加して、行頭 # の行は読み飛ばすことにしました。

>        StringTokenizer tk = new StringTokenizer(line);
>        if (!tk.hasMoreTokens()) { continue; }
>        String urlspeck = tk.nextToken();
>        if (!tk.hasMoreTokens()) { continue; }
>        String path = tk.nextToken();
>          System.out.println(urlspeck + " " + path);
>        ud.urlDown(urlspeck, path);
>      }
>    }
>    catch (FileNotFoundException e) {
>    }
>    catch (IOException e) {
>    }
>  }
>}
>==================================================================
>
>いちおうこれで目的は達したので今日はここまでにします。m(_ _)m

ぜんぜん達してませんでした。^^;

## Javaとは無関係ですが、MFC の ソース( CView の派生クラス) を山手線の
## 中で眺めていたら、イベントモデルがあまりにもダサダサなので食欲(?)が
## うせました。^^; 
## Java で Delegation Listener モデルを書いているときは幸せなのに... ;_;
## やっぱ久野さんの言う通り WFC に取って代わられる運命なのかな。
### でも "delegate" (クラスを無視したメソッドポインター) は使うのやだ。
------------------------------------------------------------------
遠藤靖之 (えんどう やすゆき) <yasuyuki@xxxxxxxxxx>
http://www.freepage.total.co.jp/jfriends/ (Java互助会ホームページ)
株式会社タイムインターメディア 情報通信サービス部 TEL 03-5362-9009
〒162-0065 新宿区住吉町3-11 新宿スパイアビル8F    FAX 03-5362-9008