2

またはを共有できますInputStreamOutputStream?

たとえば、私が最初に持っているとしましょう:

DataInputStream incoming = new DataInputStream(socket.getInputStream()));

...incomingオブジェクト変数です。後で私は一時的に行います:

BufferedReader dataReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

ストリームは具体的であり、ストリームからの読み取りは、どこから行われたかに関係なく、その入力を消費することを理解しています...しかし、上記を実行した後でも、両方incomingdataReader同時にアクセスできますか、または1 つのInputStreamオブジェクトに接続されているだけで、そのため、そのストリームがincoming失われます宣言したら入力しdataReaderますか?を閉じるとソケットも閉じることは理解していますが、これは控えますが、に「転送」した後、何らかの形でdataReader「回収」する必要があるかどうか疑問に思っています。私はしなければなりませんか:InputStreamincomingdataReader

incoming = new DataInputStream(socket.getInputStream());

この操作全体の後、もう一度?

4

3 に答える 3

4

小さじ 1 杯とシャベルを使って、穴から汚れを取り除きます。

ストリームが具体的であり、ストリームからの読み取りは、どこから行われたかに関係なく、その入力を消費することを理解しています

正しい。ティースプーンとシャベルはどちらも穴から汚れを取り除きます。ダートを非同期に (つまり、並行して) 除去している場合は、誰がどのダートを持っているかについて争いになる可能性があります。そのため、並行構造を使用して、相互に排他的なアクセスを提供します。アクセスが同時でない場合、つまり...

1) 小さじ 1 杯以上の土を穴から
移動させる 2) 穴から土をシャベルで
1 杯以上移動させる 3) 穴から小さじ 1 杯以上の土を移動させる
...

問題ない。ティースプーンとスコップで汚れを落とします。しかし、一度汚れを落としてしまうと、同じ汚れにはなりません。お役に立てれば。シャベルを始めましょう、ティースプーンを使います。:)

高速反射が見つかったので、ストリーム、特にバッファリングされたリーダーの共有には十分注意してください。ストリームから必要以上のバイトをむさぼり食う可能性があるためです。そのため、他の入力ストリーム (またはリーダー) に戻ると、次のようになります。大量のバイトがスキップされました。

同じ入力ストリームから読み取ることができる証明:

import java.io.*;

public class w {

    public static void main(String[] args) throws Exception {

        InputStream input = new FileInputStream("myfile.txt");
        DataInputStream b = new DataInputStream(input);

        int data, count = 0;

        // read first 20 characters with DataInputStream
        while ((data = b.read()) != -1 && ++count < 20) {
            System.out.print((char) data);
        }
        // if prematurely interrupted because of count
        // then spit out last char grabbed
        if (data != -1)
            System.out.print((char) data);

        // read remainder of file with underlying InputStream
        while ((data = input.read()) != -1) {
            System.out.print((char) data);
        }
        b.close();
    }
}

入力ファイル:

hello OP
this is
a file
with some basic text
to see how this
works when moving dirt
from a hole with a teaspoon
and a shovel

出力:

hello OP
this is 
a file
with some basic text
to see how this
works when moving dirt
from a hole with a teaspoon
and a shovel

BufferedReader がストリームから多くの文字をむさぼり食うため、動作が保証されていないことを示す証拠:

import java.io.*;

public class w {

    public static void main(String[] args) throws Exception {

        InputStream input = new FileInputStream("myfile.txt");
        BufferedReader b = new BufferedReader(new InputStreamReader(input));

        // read three lines with BufferedReader
        String line;
        for (int i = 0; (line = b.readLine()) != null && i < 3; ++i) {
            System.out.println(line);
        }

        // read remainder of file with underlying InputStream
        int data;
        while ((data = input.read()) != -1) {
            System.out.print((char) data);
        }
        b.close();
    }
}

入力ファイル (上記と同じ):

hello OP
this is
a file
with some basic text
to see how this
works when moving dirt
from a hole with a teaspoon
and a shovel

出力:

hello OP
this is
a file
于 2012-12-05T15:01:02.387 に答える
1

これは悲惨なことになります。両方のストリームでデータが破損しています。Javaは、どのデータをどのストリームに送信するかをどのようにして知ることができるでしょうか。

同じデータで2つの異なることを行う必要がある場合は、それをどこかに保存して(場合によっては、2つにコピーしてQueue<String>)、そのように読み取ることをお勧めします。

于 2012-12-05T14:57:17.970 に答える
1

わかりました、私はこれを自分で解決しました..興味深いリンク:

http://www.coderanch.com/t/276168//java/InputStream-multiple-Readers

Java の InputStream の複数のリーダー

基本的に... はInputStream複数のオブジェクトに接続して、そこから読み取って消費できます。ただし、 a はBufferedReader先読みするため、これらのいずれかを使用する場合、たとえば aBufferedReaderから a に切り替えるときに何らかのシグナルを実装するDataInputStreamことをお勧めします (つまり、 を使用してa のすべてDataInputStreamを処理する必要があります)。InputStreamの代わりに突然BufferedReader)。したがって、が処理InputStreamするすべてのデータが送信されたことがわかったら、 へのデータの送信を停止しBufferedReaderます。この後、他の部分が で処理するのを待ちBufferedReaderます。次に、新しい入力の準備が整ったことを示すシグナルを送信します。送信部分は、信号入力を受信するまでブロックする必要があり、その後データの送信を再開できます。私が使用しない場合BufferedReaderこの時点以降、すべての入力をバッファリングしてから「盗む」機会はなく、DataInputStreamすべてが非常にうまく機能します:)しかし、注意しBufferedReaderてください。 .. 知っておくと便利です!

于 2012-12-05T17:02:51.993 に答える