1つのFileInputStreamのクラスから2つのFileOutputStreamのクラス
(仮にOutputStream1、OutputStream2とします)へwriteし、
ファイル2つを作成しようとしています。
最初にOutputStream1へwriteし、次にOutputStream2へwriteしたとき、
両方のStreamで作成したファイルが空(0KB)の状態になってしまいます。
1つのInputStreamから連続して2つ以上のOutputStreamに書くことはいけない
ことなのでしょうか?(どうしてもやりたいのですが)
もしかしてFileInputStreamの完全なコピー(cloneじゃなくシリアライズして
複製を作成する)を作る方法しかないのでしょうか?とはいうものの
シリアライズできるInputStreamクラスを作成できず困っていたりします。
(あとOutputStreamをInputStreamに変換できたらなぁとかも思うの
ですが無理ですよね・・・?)
どなたかご存じの方、是非ご教授下さい。
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 …
No.2
- 回答日時:
補足ですが、
Stream系のクラスは、前述のとおり「流れ」なので、シリアライズすることができません。
また、性質上、OutputStreamをInputStreamに変換することもできません。そもそも目的がまったく違いますので、、、。
ストリームについては、参考URL等をごらんください。
参考URL:http://home.catv.ne.jp/dd/chiba/ken/Java/JavaStr …
回答&アドバイスありがとうございました。
大変わかりやすく説明していただき、長い間の疑問であった部分がまさに
霧が晴れるかのごとくすっきりとしました。(現在感動中)
シリアライズに関してはできないのだろうとは思っていたのですが
thelmaさんのご説明のおかげで納得することができました。
参考URLもとても参考になりますね。あとでじっくりと読みたいと思います。
本来やりたいことは"今回教えていただいた内容の変形"+"その他たくさんの内容"。
ですので、全てがうまく流れたら「できました!」のお知らせも兼ねてポイント発行
させていただきたいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 画像編集・動画編集・音楽編集 inkscapeで作成した図の保存の仕方とその保存したファイルの編集の仕方 1 2022/09/22 09:33
- Excel(エクセル) Excelで全クラスのランキング表を作成したい 4 2022/05/24 15:28
- Excel(エクセル) 1つのファイルを3つのフォルダにファイル名を【明日の日付】にして、コピーをしたい 2 2022/12/21 17:43
- UNIX・Linux VirtualBox ゲストOSにPC内蔵HDDのパーティションをマウントする方法は? 2 2023/05/06 22:52
- UNIX・Linux サーバー間のデータコピー(データ形式とデーターフォーマットの変換あり。一定間隔で処理) 2 2023/08/22 22:15
- Windows 10 Corsair SSDが遅い (2)WDに比べて 3 2023/04/25 11:21
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Visual Basic(VBA) エクセルのマクロについて教えてください 物件ごとのフォルダを作成してます そのフォルダ内にサブフォル 2 2023/07/02 17:58
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/21 09:42
- Excel(エクセル) 2つのマクロを連続して動かしたい 3 2022/09/20 23:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ジャバスクリプトについて。
-
1~100までの数字を表示し、か...
-
System.err. printlnとSystem.o...
-
Javaで改行などが出来ないのです。
-
System.out.printlnの出力先
-
数字文字列をパック10進数に変...
-
system.out.printが出力されない
-
JavaScriptの変数をjavaのメソ...
-
Eclipseのコンソールを常に表示...
-
Java 九九の表について
-
flush()とclose()について
-
プールとスプールの違いがわか...
-
Log4jで機能毎に別ファイルへ出...
-
一定のスペースを空けて端を揃...
-
ArrayList内HashMapの取得
-
Javaの問題なのですが、 永久ル...
-
テキストファイルから文字列を...
-
switch分が機能しません。
-
1~100までの数字を表示したい
-
デバックで行数出力
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
Log4jで機能毎に別ファイルへ出...
-
System.out.printlnの出力先
-
Eclipseのコンソールを常に表示...
-
Javaで改行などが出来ないのです。
-
flush()とclose()について
-
system.out.printが出力されない
-
1~100までの数字を表示し、か...
-
StringBufferで改ページ処理を...
-
InputStreamはreadが1回しかで...
-
JavaScriptの変数をjavaのメソ...
-
Tomcatが無応答となる現象が起...
-
1~100までの数字を表示したい
-
switch分が機能しません。
-
数字文字列をパック10進数に変...
-
VBSエラー"オブジェクト型の変...
-
Apache POI のログについて
-
System.out.printlnの意味がよ...
-
Javaの問題なのですが、 永久ル...
-
OpenSSL関数エラーについて
おすすめ情報