プロが教える店舗&オフィスのセキュリティ対策術

1つのFileInputStreamのクラスから2つのFileOutputStreamのクラス
(仮にOutputStream1、OutputStream2とします)へwriteし、
ファイル2つを作成しようとしています。
最初にOutputStream1へwriteし、次にOutputStream2へwriteしたとき、
両方のStreamで作成したファイルが空(0KB)の状態になってしまいます。
1つのInputStreamから連続して2つ以上のOutputStreamに書くことはいけない
ことなのでしょうか?(どうしてもやりたいのですが)

もしかしてFileInputStreamの完全なコピー(cloneじゃなくシリアライズして
複製を作成する)を作る方法しかないのでしょうか?とはいうものの
シリアライズできるInputStreamクラスを作成できず困っていたりします。
(あとOutputStreamをInputStreamに変換できたらなぁとかも思うの
 ですが無理ですよね・・・?)

どなたかご存じの方、是非ご教授下さい。

A 回答 (2件)

Streamは、その名の通り「データの流れ」であって、データそのものではありません。


そのため、いったんread()を繰り返してファイルの終端に達してしまうと、以降のread()は常にファイルの終端を返します。
(巻き戻せるものもありますが、FileInputStreamは違います)

この場合は、処理の順序をうまく組み立てれば解決すると思います。

a)OutputStreamを2つ同時にオープンし、同時に書き込む。
FileInputStream in = new FileInputStream("in.txt");
FileOutputStream out1 = new FileOutputStream("out1.txt");
FileOutputStream out2 = new FileOutputStream("out2.txt");
int b;
while ((b = in.read()) != -1) {
out1.write(b);
out2.write(b);
}
in.close();
out1.close();
out2.close();

b)InputStreamをいったんbyte配列に読み込み、そのbyte配列をOutputStreamに書き込む。
FileInputStream in = new FileInputStream("in.txt");
byte[] bytes = new byte[in.available()];
in.read(bytes);
in.close();
FileOutputStream out1 = new FileOutputStream("out1.txt");
out1.write(bytes);
out1.close();
FileOutputStream out2 = new FileOutputStream("out2.txt");
out2.write(bytes);
out2.close();

c)InputStreamをいったんcloseして、再度newする。

他にやりたいことにあわせて、お好きな手段が使えると思います。

参考URL:http://java.sun.com/j2se/1.4/ja/docs/ja/api/java …
    • good
    • 0

補足ですが、


Stream系のクラスは、前述のとおり「流れ」なので、シリアライズすることができません。
また、性質上、OutputStreamをInputStreamに変換することもできません。そもそも目的がまったく違いますので、、、。

ストリームについては、参考URL等をごらんください。

参考URL:http://home.catv.ne.jp/dd/chiba/ken/Java/JavaStr …
    • good
    • 0
この回答へのお礼

回答&アドバイスありがとうございました。
大変わかりやすく説明していただき、長い間の疑問であった部分がまさに
霧が晴れるかのごとくすっきりとしました。(現在感動中)
シリアライズに関してはできないのだろうとは思っていたのですが
thelmaさんのご説明のおかげで納得することができました。
参考URLもとても参考になりますね。あとでじっくりと読みたいと思います。

本来やりたいことは"今回教えていただいた内容の変形"+"その他たくさんの内容"。
ですので、全てがうまく流れたら「できました!」のお知らせも兼ねてポイント発行
させていただきたいと思います。

お礼日時:2003/06/25 10:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!