- PR -

ファイル書き込みの謎

1
投稿者投稿内容
あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2008-01-21 09:50
今、Streamを勉強しています。
その際に次のような現象を発見しました。
どなたかこの現象を説明できませんでしょうか。

==========================
読込ファイルin.txt 書込ファイルout.txtの場合、
正常にin.txtからout.txtに内容がコピーされる
しかし、
読込ファイルin.txt 書込ファイルin.txtの場合、
in.txtが0バイトになる。

コード:
public class Test9 {
    public static void main(String[] args) {
        String inPath = "D:\\in.txt";
        String outPath = "D:\\out.txt";

        BufferedInputStream in = null;
        BufferedOutputStream out = null;
        try {
            in = new BufferedInputStream(new FileInputStream(inPath));
            out = new BufferedOutputStream(new FileOutputStream(outPath));

            byte b[] = new byte[0x10000];
            for(int read = -1; (read = in.read(b, 0, b.length)) != -1;) {
                out.write(b, 0, read);
            }
            out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                in.close();
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}


ちなみに、in.txtには「あいうえお」と書かれているだけです。
==========================
同じファイルのinとoutのStreamを生成し
for文で読み込んだファイルの内容をoutのバッファに書き込んで
最後にflushしているのだから
正常に書き込まれるのではないか
と思ったのですが、何故かなりません。

何故in.txtが正常に書き込まれないのか判りませんでしょうか。

なお、実行環境はJDK1.4.2_08、JDK1.5.0_13、JDK1.6.0_3で確認しました。
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2008-01-21 10:13
outをflushする前に、inをcloseしたら、どうなります?
あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2008-01-21 11:50
お返事ありがとうございます。
引用:

outをflushする前に、inをcloseしたら、どうなります?


私も、inストリームを開いている状態で
Flushしたせいかと思い試してみましたが、
結果は変わりませんでした。

ちなみにReader→Writerでやっても同じ結果が出ますし
バッファリングしなくても同じ結果が出ます。
Streamの内部で何かやっているのかと思ってますが
謎です。

いっきゅう
大ベテラン
会議室デビュー日: 2004/04/04
投稿数: 153
お住まい・勤務地: 兵庫
投稿日時: 2008-01-21 12:45
FileOutputStreamでnewした時点でファイルが0バイトで作成されます。
そのためだと思いますが

readし終わった後にnewするとどうなりますか?
あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2008-01-21 14:17
引用:

FileOutputStreamでnewした時点でファイルが0バイトで作成されます。
そのためだと思いますが


b
まさにこれが理由のようでした。
読み込んでからFileOutputStreamを生成すると
0バイトになりませんでした。
今までflushした時点で作成されるものと誤解していました。
とても大切なことを知りました。
大感謝です。
朝日奈 ありす
ベテラン
会議室デビュー日: 2007/10/28
投稿数: 57
お住まい・勤務地: 北の都
投稿日時: 2008-01-21 23:25
解決したようでよかったですが・・

ストリームをTry句内部で閉じない場合は null チェックをしましょう。

ストリーム作成時に IOException が発生した場合、NullPointerExceptionが発生します。
1

スキルアップ/キャリアアップ(JOB@IT)