1
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class BufferedInputOutputStreamExample
{
    public static void main(String[] args) {
        try{
        BufferedInputStreamExample bisx=new BufferedInputStreamExample();
        BufferedInputStream bis=bisx.inputMethod();

        BufferedOutputStreamExample bosx=new BufferedOutputStreamExample();
        bosx.outputMethod(bis);
        }
        catch(FileNotFoundException fnf)
        {
            System.out.println("Sorry--------File not exists");
        }
        catch(IOException io)
        {
            System.out.println("IOException   ---:"+io.getMessage());
        }


    }
}
class BufferedInputStreamExample
{
    BufferedInputStream bis=null;
    BufferedInputStream  inputMethod()throws FileNotFoundException,IOException
    {
            FileInputStream fin=new FileInputStream("C:/e-SDK-4.1-win32-x86_64 (1)/RahulExample/src/Test.java");
            bis=new BufferedInputStream(fin); 
            int c;
            while((c=bis.read())!=-1)
                System.out.print((char)c);
            System.out.println();

        return bis;
    }
}
class BufferedOutputStreamExample
{
    BufferedOutputStream bos=null;
    int outputMethod(BufferedInputStream bis)throws IOException,FileNotFoundException
    {
        bos=new BufferedOutputStream(new FileOutputStream("C:/varun.txt"));

        int c;

        while((c=bis.read())!=-1){
            bos.write(c);
        }
        bis.close();
        bos.close();
        System.out.println("File created.............");
        return 1;
    }
}

このプログラムでは、bufferedoutputstream を使用して varun.txt ファイルに Test.java ファイルのコンテンツを書き込みたいときに、bufferedinputstream を使用してファイルからコンテンツを読み取ります。そのファイルは作成されますが、varun.txt には何も書き込まれません。 Test.java の内容を読み取らずに varun.txt に書き込み、ファイルを作成して両方に書き込みます。

4

1 に答える 1

1

を呼び出すとbisx.inputMethod()、その内容を出力するためにストリームを読み込んでいます。問題は、まだそれをしたくないということです。ストリームを読み取るとそれが消費されるため、返すストリームは既に最後にあり、読み取るものが残っていません。

ファイルのすべての内容を出力してから、すべてを別のファイルに書き込む場合、それは 2 つの別個の操作です。ファイルのサイズに応じて、ファイルを 2 回 (2 つの異なる入力ストリームを使用して) 読み取るか、全体をメモリにバッファリングする必要があります。

代わりに、ファイルをコピーするときにファイルの内容を表示したいだけの場合 (これが本当の目的のようです)、価値のあるオプションがいくつかあります...

  • 出力ファイルに書き込んでいるときに、データを印刷outputMethodすることができます。これはおそらく、短期的には最も簡単な修正です。もちろん、inputMethodストリームを読み取るコードも削除します。

  • サブクラス化FilterInputStreamFilterOutputStreamするか、ストリームを定義して、データの読み取りまたは書き込みを (それぞれ) 行うたびに、それとは別のことも行うことができますたとえば...

    • にデータを印刷しますSystem.out非常にシンプルですが、厳格です。考えれば考えるほど……うーん。

    • データを別の任意の出力ストリームにコピーします。 これははるかに柔軟です。たとえば、ログ ファイルなどに送信できます。また、 に比べて余分なコードをほとんど必要としないためSystem.out.print、通常、費用対効果の高い部門で勝ちます。

    • 他のオブジェクトがサブスクライブできるイベントをトリガーします。これにより、ほぼ無限の柔軟性が得られます (サブスクライバーはストリームを気にする必要がなくなるため) が、かなり複雑になる可能性もあります。(基本的に、イベント/サブスクリプション API を追加する必要があります。) 通常、このような小さなプロジェクトではやり過ぎです。

    このルートを使用する場合は、オブジェクトのコンストラクターがストリームを作成するのではなく、ストリームを取得するようにリファクタリングを検討する必要があることに注意してください。そうmainすれば、出力が発生するかどうか、どこに出力されるかを決定でき、他のオブジェクトは気にする必要さえありません。ストリームを通常の古い InputStreams および OutputStreams として扱い、自分の仕事をするだけでよく、渡されたストリームによって他に何が起こるかが決まります。

(ちなみに: 主要な問題に集中するために、 にキャストして「デコード」しているという事実を半無視しましたchar。これは、事実を知らない限り、ファイルの内容を忠実に再現しない可能性があります。内容は ASCII 文字であること.出力はデバッグ用のものであると想定しているため、これは長い間文句を言う価値はありません...しかし、一般的なケースでは、問題を引き起こす可能性が高いことを知っています.)

于 2012-07-10T16:47:29.010 に答える