5

FileInputStream または ObjectInputStream のいずれかである可能性のある InputStream からデータを読み取ろうとしています。これを実現するために、ストリームのクローンを作成してオブジェクトを読み取ろうとし、例外が発生した場合は、apache commons io を使用してストリームを文字列に変換したいと考えました。

    PipedInputStream in = new PipedInputStream();
    TeeInputStream tee = new TeeInputStream(stream, new PipedOutputStream(in));

    Object body;
    try {
        ObjectInput ois = new ObjectInputStream(tee);
        body = ois.readObject();
    } catch (Exception e) {
        try {
            body = IOUtils.toString(in, Charset.forName("UTF-8"));
        } catch (Exception e2) {
            throw new MarshallerException("Could not convert inputStream");
        }
    }

残念ながら、ストリームを文字列に変換しようとすると、プログラムが着信データを待機するため、これは機能しませんin

4

1 に答える 1

8

すでに Boris Spider がコメントしているように、ストリーム全体をバイト配列ストリームなどに読み取ってから、そのリソースで新しいストリームを開くことができます。

    byte[] byteArray = IOUtils.toByteArray(stream);     
    InputStream input1 = new ByteArrayInputStream(byteArray);
    InputStream input2 = new ByteArrayInputStream(byteArray);

    Object body;
    try {
        ObjectInput ois = new ObjectInputStream(input1);
        body = ois.readObject();
    } catch (Exception e) {
        try {
            body = IOUtils.toString(input2, Charset.forName("UTF-8"));
       } catch (Exception e2) {
            throw new MarshalException("Could not convert inputStream");
        }
    }
于 2014-06-29T10:36:55.757 に答える