タイトルの通りです。
何かと便利な java.io.PushbackInputStream ですが、メソッド unread(int b) に EOF のつもりで -1 を渡してもうまく動作しません。
read() すると、255 が返ってきます。トホホ。
それだけです。
java.io.RandomAccessFileクラスですが、なぜかファイルのサイズを小さくすることが出来ません。
と、思ってメーリングリスト JavaHous-Brewers に質問したら、「JDK1.2ではsetLength(long newLength)というメソッドが増えてるよ」という情報をもらいましたので、試しにテストプログラムを書いてみました。
|
|
JDK1.2、早くでないかなぁ…。
|
上記のプログラムでは、オブジェクトのを含むVectorをファイルに保存しています。
Vectorをディスクから読み込むと何と!中に含まれるオブジェクトも読み込まれるんですねー。
しかし、この話には続きがあります。
import java.util.*; public class obj {
public serobj() {} public serobj(int i) {
private static final String FILE_NAME = "t.tmp";
ObjectOutputStream p = new ObjectOutputStream(ostream); serobj s = new serobj(10); p.writeObject(s); ostream.close(); FileInputStream istream = new FileInputStream(FILE_NAME);
static public void main(String args[]) {
|
import java.util.*; class serobj implements Serializable {
public serobj() { } public serobj(int i) {
public class obj {
public obj() {
ObjectOutputStream p = new ObjectOutputStream(ostream); serobj s = new serobj(10); p.writeObject(s); ostream.close(); FileInputStream istream = new FileInputStream(FILE_NAME);
static public void main(String args[]) {
|
とすると、正常に実行できます。
これは仕様?バグ?私のコードがヘボ?
すごい、のかなぁ?Javaって。
しかし、この話にはさらに続きがあります。
インナークラスのシリアライゼーションについて、メールを頂きました。
「シリアライズに失敗しているのは、アウタークラスの obj が Serializable を implements していないからでは?」
おっしゃる通りでした!
以下のように修正すると、見事に成功しました。(JDK1.1.6)
import java.io.*;
import java.util.*;
public class obj implements Serializable {
class serobj implements Serializable {
int i;
}public serobj() {}
public serobj(int i) {
this.i = i;
}private static final String FILE_NAME = "t.tmp";
public obj() {
try {
FileOutputStream ostream = new FileOutputStream(FILE_NAME);
ObjectOutputStream p = new ObjectOutputStream(ostream);
serobj s = new serobj(10);
p.writeObject(s);
ostream.close();FileInputStream istream = new FileInputStream(FILE_NAME);
ObjectInputStream ois = new ObjectInputStream(istream);
s = (serobj) ois.readObject();
p.close();
System.out.println("serobj.i = " + s.i);
} catch (IOException ioe) {
}ioe.printStackTrace();
} catch (ClassNotFoundException cnfe) {ioe.printStackTrace();
}
static public void main(String args[]) {new obj();
}
}(しかし、以前同じ事を試した際には出来なかったような気が…)
メールをくださった吉川さん、どうもありがとうございました。
|