Java

Java で、cookie を処理する方法

ずばり、J2SE のドキュメントのページ「cookie サポート」が詳しい。以下のコードを参照のこと。

String protocol = "http"; String hostname = "yourdomain.com"; int port = 80; String file = "/"; try {
URL url = new URL(protocol, hostname, port, file);

HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);    // Input OK
conn.setDoOutput(true);   // Output OK
conn.setUseCaches(false); // Cache NG
conn.setRequestProperty("Content-type",
        "application/x-www-form-urlencoded");
conn.connect();           // Connect

boolean isRedirect = HttpURLConnection.getFollowRedirects();

String cookieValue = null;
try {
    Map<String, List<String>> headers = conn.getHeaderFields();
    List<String> values = headers.get("Set-Cookie");
    for (Iterator<String> iter = values.iterator(); iter.hasNext();) {
        String v = iter.next();
        if (cookieValue == null)
            cookieValue = v;
        else
            cookieValue = cookieValue + ";" + v;
    }
} catch (Exception e) {
}
System.out.println(this.getClass().getName()
        + ": cookieValue: " + cookieValue);
conn.close(); } catch (Exception e) {
e.printStackTrace();
return false;
}
続きを読む

Java で、2 バイトから正の整数を作る方法

例えばネットワーク越しのデータのやり取りとかで、'01c0' というバイト列があったとする。そしてこの 2 バイトが続くバイト列の長さを表わしいてるような場合の処理を考える。01c0 は、2バイトで


0x01c0 = 0x0100 + 0xc0 = 256 + 192 = 448

を表すとする。

byte[] b = {0x01, 0xc0}; // 例えば、この場合、256 + 192 = 448 となる。 int length = ((b[0] & 0xff) << 8 ) + (b[1] & 0xff); </code>
続きを読む

Java で、バイト列を文字列に変換・表示する方法

以下のメソッドを使えばよい。引数にバイト列 (byte[]) を与えると、そのバイト列を 16 進数表記に変換した文字列が返される。

public String byteToString(byte[] b) {
StringBuffer s = new StringBuffer();
for (int i = 0; i < b.length; i++) {

    int d = b[i];
    d += d < 0 ? 256 : 0; // byte 128-255
    if (d < 16) { //0-15 16
        s.append("0");
    }
    s.append(Integer.toString(d, 16));
}
return s.toString();
}

または、以下のようにしてもよい。

public String byteToString(byte[] b) {
if (b == null || b.length <= 0) return null;
byte ch = 0x00;
String pseudo[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
StringBuffer s = new StringBuffer(b.length * 2);

for(int i = 0; i < b.length; i++) {

    ch = (byte) (b[i] & 0xf0);
    ch = (byte) (ch >>> 4);
    ch = (byte) (ch & 0x0f);
    s.append(pseudo[(int) ch]);
    ch = (byte) (b[i] & 0x0f);
    s.append(pseudo[(int) ch]);
}
return s.toString();
}
続きを読む

Java で、ハッシュ値 (ハッシュダイジェスト) を扱う

Java で、ハッシュ値(ハッシュダイジェスト)を扱うには、例えば以下のようにする。

使用するクラス


import java.security.MessageDigest;
import java.security.MessageDigest; public class HashTest {
public static final String HASH_ALGORITHM = "SHA1";
// public static final String HASH_ALGORITHM = "MD5";
public static final String password = "password";

public static void main(String[] args){

    try {
        password =  this.getDigest(password);
    } catch(Exception e) {
e.printStackTrace();
    }
}

public String getDigest(String data) throws Exception {

    StringBuffer s = new StringBuffer();
    MessageDigest md = MessageDigest.getInstance(HASH_ALGORITHM);
    byte[] dat = data.getBytes();
    md.update(dat);

    byte[] digest = md.digest();
    for (int i = 0; i < digest.length; i++) {
        int d = digest[i];

        if (d < 0) {  // byte 128-255
            d += 256;
        }
        if (d < 16) { //0-15 16
            s.append("0");
        }
        s.append(Integer.toString(d, 16));
    }
    return s.toString();
}
}
public static final String HASH_ALGORITHM = "SHA1"; // public static final String HASH_ALGORITHM = "MD5"; ... MessageDigest md = MessageDigest.getInstance(HASH_ALGORITHM);

のように、MessageDigest オブジェクトのインスタンス取得のときにハッシュアルゴリズムを指定することができる。また、

byte[] digest = md.digest();

だけでは、byte[] しか返ってこないので、ダイジェスト値を文字列として扱いたい場合はこのJava のバイト列を文字列に変換する必要がある。

続きを読む

Java が使われている有名なシステム・ソフト

Java が使われているシステムやソフトは枚挙にいとまがない。ここではその事例を挙げてみよう。

続きを読む

Java について

以下、情報化白書 2000 に寄稿したもの (文末表現、接続語等を時代に合わせて一部改変)。

Java には「プログラミング言語としての Java」と「実行環境としての Java」の 2 つの側面がある。言語としてのJava はオブジェクト指向であり、言語の一部としてクラスライブラリが提供される。言語仕様は C++ の流れを汲んでいるが、バグの原因となりやすいポインタをなくし、メモリ管理も自動化しているなどの特長を持つ。実行環境としての Java の理念は「1度書けばどこでも動く」というものである。通常 C/C++ 言語などで書かれたプログラムではコンパイル後、特定のプラットフォーム (OS) 上でしか動作しないが、Java では同一の Java プログラムが異なるプラットフォーム上で動作するようになっている。これは Java のコンパイルされた結果であるバイトコードと呼ばれる中間コードが、それぞれのプラットフォームごとに用意された Java VM (Virtual Machine) で動作するという仕組みのためである。

1995 年に最初の Java がリリースされて以来、Java の進展と共にそのライブラリの数も膨大なものとなり、開発元の Sun Microsystems は 1999 年 7月、Java をアーキテクチャーごとに 3つに分けて整理した。すなわち、Java 2 Platform, Standard Edition (J2SE)、Java 2 Platform, Enterprise Edition (J2EE)、Java 2 Platform, Micro Edition (J2ME) で、それぞれデスクトップ向け、サーバ向け、携帯端末向けの Java である。

Java と言えば当初はクライアント側のブラウザ上で動作する Java アプレットが有名だったが、最近ではサーバ側の J2EE としてアプリケーションサーバ上でビジネスロジックの記述やデータベースとの連携に適用されることが多くなってきている。 また、携帯端末に J2ME を適用する動きも活発である。韓国の LG テレコムは世界で初めて携帯電話に Java を載せ実用化しており、日本でも NTT ドコモが 2001 年早々に Java のプログラムが動作する携帯電話を発売している。

続きを読む

Java で、JDBC を使って MySQL にアクセスする方法

Java で MySQL にアクセスするには、MySQL 用の JDBC のドライバが必要である。このドライバは MySQL のサイトから入手できる (MySQL Connector/J とあるので、安定版または最新バージョンをダウンロードする)。

ダウンロードしたものを解凍すると、mysql-connector-java-x.x.xx-bin.jar というファイルがあるはずなので、これを (Linux の場合は) $JAVA_HOME/jre/lib/ext にコピーする。ここに JAR ファイルを置いておく限り、このドライバ (JAR ファイル) に対する CLASSPATH は特に設定する必要はない。

以下はデータベース中の users テーブルから、name と password という 2つのフィールドを読み出す例である (MySQLJDBCTest.java という名前で保存)。

import java.sql.*; public class MySQLJDBCTest {
public static void main(String[] args) {

    try {
        // ドライバをロード
        Class.forName("org.gjt.mm.mysql.Driver");

        // データベースへ接続
        String url = "jdbc:mysql:///データベース名?&user=ユーザー名&password=パスワード&"
                   + "useUnicode=true&characterEncoding=UTF-8";
        Connection con = DriverManager.getConnection(url);

        // SQL 文を生成
        Statement s = con.createStatement();
        String sql = "SELECT * FROM `users`";

        // クエリーを実行して結果セットを取得
        ResultSet rs = s.executeQuery(sql);

        // 検索された行数分ループ
        while(rs.next()){
            String name     = rs.getString("name");  // ユーザー名
            String password = rs.getString("pass");  // パスワード

            // 表示
System.out.println(name + " / " + password);
        }

        // データベースから切断
        s.close();
        con.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

コンパイル

# javac MySQLJDBCTest.java

実行

# java MySQLJDBCTest
続きを読む

Ant で、com.sun.tools.javac.Main is not on the classpath. というエラーへの対処

$JAVA_HOME を正しく設定していて、コンパイラが正常に動作しているのも関わらず以下のエラーに遭遇したとき、


build.xml:xxx: Unable to find a javac compiler;
com.sun.tools.javac.Main is not on the classpath.
Perhaps JAVA_HOME does not point to the JDK

Linux の場合は、$JAVA_HOME/lib にある tools.jar を、$JAVA_HOME/jre/lib/ext にコピーしてあげればよい (試してはいないが、Windows その他でもこの方法でイケると思う)。


# cp $JAVA_HOME/lib/tools.jar $JAVA_HOME/jre/lib/ext
続きを読む

Linux に、Ant をインストールする

Ant は Java 版の make だと思ってよい。

以下の URL にアクセスして Apache Ant をゲット。

コンソールから以下のコマンドを実行


# ./build.sh

ビルドが成功すると、dist ディレクトリが作成されていて、その中に bin と lib というディレクトリができている。bin にある ant (シェルスクリプト) と、lib にあるすべての jar ファイルを以下のディレクトリにコピーする。


# cp ./bin/ant <font color="blue">/usr/local/bin</font>
# cp ./lib/*.* <font color="blue">/usr/java/jdk1.5.0_06/jre/lib/ext</font>
続きを読む

Java で、設定ファイルから値を読み込む方法

Java で設定ファイル (Attribute = Value の形式) を用意して、その設定ファイルに書いた属性の値を読み込むには、Class#getResourceAsStream(String s) メソッドを使う。以下、定義ファイルに host=10.0.0.1、port=8080 と書いてあるものを、Client#init() メソッドの中で処理する例である。ひな型として以下の 3つのファイル (Client.java、ClientImpl.java、Client.properties) は 3点セットとし自分のパターンとして持っておきたい。

Client.properties ファイルの内容 (以下の 2行)


host=10.0.0.1
port=8080

Client.java ファイルの内容

public interface Client {
public static final String PROPERTY_FILE = "Client.properties";
public static final String HOST = "host";
public static final String PORT = "port";

public void init();
}

ClientImpl.java ファイルの内容

import java.io.InputStream; import java.util.Properties; public class ClientImpl implements Client {
public static String DEFAULT_HOST = "192.168.0.1";
public static int    DEFAULT_PORT = 1024;

public static void main(String[] args) {

    Client client = new ClientImpl();
    client.init();
}

public void init() {

    this.getProperties();
System.out.println("host: " + DEFAULT_HOST); System.out.println("port: " + DEFAULT_PORT);
}

protected void getProperties() {

    try {

        InputStream is = getClass().getResourceAsStream(Client.PROPERTY_FILE);
        Properties p = new Properties();
        p.load(is);

        if (p != null) {

            // Read a host address
            String host = p.getProperty(Client.HOST);
            if (host != null)
                DEFAULT_HOST = host;

            // Read a port
            String port = p.getProperty(Client.PORT);
            if (port != null)
                DEFAULT_PORT = Integer.parseInt(port);

        }
    } catch (Exception e) {
        System.out.println("File not found: " + Client.PROPERTY_FILE
                + ".  Ignored the error.");
    }
}
}

コンパイル方法 (コンソール (Windows の場合はコマンドプロンプト) より)


> javac *.java

実行方法 (コンソール (Windows の場合はコマンドプロンプト) より)


> java ClientImpl
続きを読む
Java を購読