|
このサーバは、Tomcatもインストールされているので、そちら関係でいろいろやってみましょうね。
Java の機能は多すぎます、やりたいことを決めてから取りかかりましょう。
J2SEのドキュメント類は、日本語版があります。まずはそこから見てみる事をすすめしておきます。
Javaには、Windowsのレジストリのようなものはありませんでしたが、JDK1.4から使えるようになっています。それまではどうしていたかというと、java.util.Property が使えましたが、Propertyには決まった保存場所等々がありませんでした。
java.util.prefs.Preferences が、新しいものです。
参考
MPEG的なデータを読んだりしてみようと思い、BitInputStream を適当に作ってみた。配列的な読み込みにも対応しているぞ。BitOutputStream は開発中。javadoc は用意してないな・・・。
net.siisise.io.BitInputStream.java
PKIなファイルを触っている中で、いろいろ必要になったりしたので net.siisise.io.BASE64.java を作ってみた。decodeには同パッケージの Packet.java が必要。その他ライブラリは不要です。Stream形式での実装もしてみようかと思うけど、そこまでは必要なさそ。
JavaMailの中には javax.mail.internet.MimeUtility などもあるようですが、なんとなく面倒な感じがしそう。apache commons codec にも似たようなものがありますが、文字列として扱っていないのであれです。エンコードはこちらの方が改行も入れられるし速かったりするかもしれません。
jarは、Javaのclassファイルをまとめたもので、ライブラリや実行ファイルなどとして利用されています。
作り方
jar cvf 圧縮ファイル.jar 各ファイル
マニフェストファイルというものを入れると、jar形式のまま実行することもできます。
Main-Class: net.siisise.Example
jar の利用例
warやearは、jarを特定用途向けにカスタマイズしたもので、クラス以外のものを含んでいて、ライブラリとしては利用できません。
参考
Javaのエラーが読めるようになれば、ふつーのJava開発者かもしれません。そんなわけない?
エラーには2つありますね。コンパイルのときと、実行のとき。
Javaの実行時エラー(Exception等)は、プログラム中ではtry catch 文で捕まえることができます。捕まえられたエラーはprintStackTrace() でエラーとしてコンソール上に表示する場合も多くあります。どのクラスのどこで、どの種類のExceptionが発生しているのかという内容が表示されるのですが、まず自分の知っている(自分で作った)クラスをみつけます。そして、上の方へたどっていって、知らないクラスの手前まで見ていくと、そこが大抵のエラーの原因になっている場所です。あとは、Exceptionの意味をAPIのリファレンスなどで調べてみましょう。
Javaアプリケーションを作るために必要なクラスはどんなものなのか、簡単にまとめてみようか。
Javaアプリケーションは Frame を継承して作る、などと書かれている書籍がありますが、あれはウソです。
Frame を継承しなければならなかったのはJDK1.0の頃の話しで、JDK1.1のAWTらは構造が全く変わったのでこれは当てはまりません。
JFrame は、継承せずにそのまま利用します。継承しなければならないのは、描画に必要なJComponent
的な部分です。本体になるclassは、JComponent
などを継承するとよいでしょう。各種イベント等々も、このクラスで処理することもできますし、他のクラスを用意して対応する事もできます。
Swingを使ったアプレットの場合は、JApplet とJComponent
2つがないとボタン等の配置ができても描画ができないので、JComponentとJApplet
の2つを仕方なく用意します。main()メソッドもJApplet
の中に作り、そこでJFrameを用意すると、アプレットでもアプリケーションでもどちらでも動作するものがつくれます。
[lang] にもメモメモ
時々、シフト演算子( <<, >>, >>> )を使うことがあります。変な仕様だったので、メモしておきます。
シフト演算子が使えるのは、整数型のみですが、その中でも byte,short,char は int化されてからシフト演算されます。こんなの意味あるのかどうか不思議です。実質 intとlongだけしかシフト演算が使えないようなものです。
右辺も制限あり。32ビット以上のシフトができません。指定できるのは、int型なら31ビットシフトまで、longなら63ビットシフトまで。下位5ビット、6ビットしか見てくれません。これではデータを32ビット以上シフトして追い出すことなどができないので別の処理をくわえてやらないといけません。なんか不便です。
int型で 1 << 33 は 1 << (33 & 0x1f) として処理される。結果は2。33ビットシフトされて結果が0になったりはしない。
c = a << b をC言語風にしたければ、
c = ((b < 32) ? (a << b) : 0);
と書かないといけません。マイナスまで含めるとさらに複雑かも。
byte, short の論理シフトは実質使い物になりません…。
import するときは、*でパッケージごと指定するよりもクラス単位で指定した方がいいと言われます。何故でしようか。
クラス名が同じだった場合に混乱しないようにするため、です。しかし、それならimportしないで全ての箇所でパッケージ名も含めて記述する方が確実です。
* を使った方が便利な場合は、*を使えばいいのです。
2002.9.15
Java Developer 2002.9月号(ソフトバンク出版)の記事をみていて、何か変ではないかなと思って書いてみた。
try ~ catch には、finally というものも存在します。これは、try
文内の処理を抜けるときに正常でもExceptionが発生しても必ず実行されるものです。
try catch の後に書けば、finally を書かなくても実行してくれるのではないでしょうか? という疑問があります。
それはそのとおりのようです。ではなぜ、try catch に finally という構造が追加されたのでしょうか。try
文の後が実行されない場合があるということを考えてみれば、その答えが出てくるかもしれません。
次の文が実行されないのは、try の中で例外(Exception) が発生したときぐらいのものです。また、try catch
の中にネスト構造で try catch を記述することも可能です。このことから、内部のtry catch
文で捕らえきれなかった例外が起きた場合に実行されるのではないかと考えてみました。
まだ試していません。さて、どうなるでしょう?
どこで書こう・・・。
より抽象的にクラス同士を結びつけるにはどうすればいいのかってのがデザインパターンみたいなものだ。
コレクションフレームワークっていうのも便利だけれど、それをイテレーターなどというものを使って画一的に扱えるとか、そういう仕組み。(書こうかやめとこか)
インターナショナリゼーションとかいうもの。
Sun One Studioでは、簡単にできます。文字列をクラスからプロパティファイルに抜き出す機能があるので、あとは訳していくだけかもしれません。国際化の機能はJDK1.2(Java 2)かな、JDK1.1だったかもしれません。その頃から使えるようになっています。
新しいライブラリは、たとえばファイル形式に対応するなどなど、新しい機能を追加してくれる。
それと同時にAPIも増えるので、それについての概念やいろいろも元々の仕様に加えて調べなくてはならなくなってしまい、より一層の手間がかかる。
たとえば、サウンドを加工/再生するのに、従来はファイル形式と再生APIだけ知っていればよかったのに、読込み手順からつくらなければならないなど、こんなことはないだろうか。
Java で印刷する。
困った困ったどうしよう。
Servlet などから印刷したいとき? PDF形式でデータ出力することを検討してみましょう。
ライブラリもあるはず。
java -D~ で指定できるいろいろなもの
メールといえば、Javaでメーリングリストを作る Majavdomo プロジェクトが元気に活動中です。
ストリームを考える?
動画/音声をストリームとして考えると
VideoOutputStream とか、AudioOutputStream というものが定義できる。
AudioInputStream があってもいいかな。
圧縮データを処理する場合の問題
ファイルでは圧縮されていて、デバイスには解凍したデータを出力しなければならない。
または、非圧縮データをファイルから読み込み、圧縮してファイルに保存する。
対象となるのはファイルとメモリー上のデータ、両方がある。どのようにストリームを接続していけばいいのだろうか。
私は、可変サイズのデータをメモリ上で持つ時に、Packetというクラスを作成して利用している。
このクラスは、1つのファイルのようにふるまうことができる。InputStreamやOutputStreamを取り出して、加工できるようになっているのである。
加工するにはいろいろあるが、そんなものかもしれない。
さて、このデータを対象に、録画/録音/再生等といったことをさせてみたい場合、どういうことになるだろうか。
再生の場合から考えてみる。
この場合、「メディア」「再生装置」があることになる。場合によっては他に出力対象の画面やスピーカーといったところまで考えておく必要がある。
このとき、再生メソッドを持つのは再生装置である。
開始するには、新規のスレッドを起こし、「メディア」からデータを読み出し、出力機器にデータを転送する。
class MP3DecodeInputStream extends FileInputStream {
}
class MP3DecodeOutputStream implements AudioOutputStream {
}
クラスの成り
ある抽象クラスに格納したデータが、サブクラスのデータであったりすることが可能な設計のクラス設計はよくある。
このとき、なるべくなら1つのクラスで完結してくれた方が便利である。
すっきりさせる方法はないものか。
[しいしせねっと]