• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:InputStreamはreadが1回しかできない?)

1つのInputStreamから連続して2つ以上のOutputStreamに書くことは可能か?

このQ&Aのポイント
  • 1つのFileInputStreamのクラスから2つのFileOutputStreamのクラスへwriteし、ファイル2つを作成しようとしています。
  • OutputStream1へwriteし、次にOutputStream2へwriteしたとき、両方のStreamで作成したファイルが空(0KB)の状態になってしまいます。
  • 1つのInputStreamから連続して2つ以上のOutputStreamに書くことはできないのか、また他の方法はあるのか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • thelma
  • ベストアンサー率66% (20/30)
回答No.1

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/io/FileInputStream.html

その他の回答 (1)

  • thelma
  • ベストアンサー率66% (20/30)
回答No.2

補足ですが、 Stream系のクラスは、前述のとおり「流れ」なので、シリアライズすることができません。 また、性質上、OutputStreamをInputStreamに変換することもできません。そもそも目的がまったく違いますので、、、。 ストリームについては、参考URL等をごらんください。

参考URL:
http://home.catv.ne.jp/dd/chiba/ken/Java/JavaStream.html
ct27
質問者

お礼

回答&アドバイスありがとうございました。 大変わかりやすく説明していただき、長い間の疑問であった部分がまさに 霧が晴れるかのごとくすっきりとしました。(現在感動中) シリアライズに関してはできないのだろうとは思っていたのですが thelmaさんのご説明のおかげで納得することができました。 参考URLもとても参考になりますね。あとでじっくりと読みたいと思います。 本来やりたいことは"今回教えていただいた内容の変形"+"その他たくさんの内容"。 ですので、全てがうまく流れたら「できました!」のお知らせも兼ねてポイント発行 させていただきたいと思います。

関連するQ&A