>  기사  >  Java  >  Java에서 OutputStream을 InputStream으로 변환하는 방법은 무엇입니까?

Java에서 OutputStream을 InputStream으로 변환하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-09 04:11:02165검색

How to Convert an OutputStream to an InputStream in Java?

출력스트림을 입력스트림으로 변환하는 방법

소프트웨어 개발에서 데이터를 변환해야 하는 상황에 직면하는 것은 드문 일이 아닙니다. 유형을 다른 유형으로 스트리밍합니다. 그러한 시나리오 중 하나는 OutputStream을 InputStream으로 변환하는 것입니다.

파이프 스트림 소개

이 문제에 대한 해결책은 Java의 PipedInputStream 및 PipedOutputStream 클래스를 사용하는 데 있습니다. 이러한 클래스는 양방향 파이프를 생성하여 스트림 간 통신을 가능하게 합니다.

PipedInputStream에서 OutputStream으로(Vice Versa 아님)

Lambda 표현식:

PipedInputStream in = new PipedInputStream();
final PipedOutputStream out = new PipedOutputStream(in);
// in a background thread, write the given output stream to the PipedOutputStream for consumption
new Thread(() -> {
    originalOutputStream.writeTo(out);
}).start();

참고: OutputStream이 조기에 닫혀 ClosedPipeException이 발생할 수 있는 상황을 처리하는 것이 중요합니다. 이를 방지하려면 생성자를 반전시킬 수 있습니다.

PipedInputStream in = new PipedInputStream(out);
new Thread(() -> {
    originalOutputStream.writeTo(out);
}).start();

Try-With-Resources:

// take the copy of the stream and re-write it to an InputStream
PipedInputStream in = new PipedInputStream();
new Thread(new Runnable() {
    public void run() {
        // try-with-resources here
        // putting the try block outside the Thread will cause the PipedOutputStream resource to close before the Runnable finishes
        try (final PipedOutputStream out = new PipedOutputStream(in)) {
            // write the original OutputStream to the PipedOutputStream
            // note that in order for the below method to work, you need to ensure that the data has finished writing to the ByteArrayOutputStream
            originalByteArrayOutputStream.writeTo(out);
        } catch (IOException e) {
            // logging and exception handling should go here
        }
    }
}).start();

PipedOutputStream을 InputStream으로

ByteArrayOutputStream이 없으면 다음 코드를 사용할 수 있습니다.

PipedInputStream in = new PipedInputStream();
final PipedOutputStream out = new PipedOutputStream(in);
new Thread(new Runnable() {
    public void run() {
        try {
            // write the original OutputStream to the PipedOutputStream
            // note that in order for the below method to work, you need to ensure that the data has finished writing to the OutputStream
            originalOutputStream.writeTo(out);
        } catch (IOException e) {
            // logging and exception handling should go here
        } finally {
            // close the PipedOutputStream here because we're done writing data
            // once this thread has completed its run
            if (out != null) {
                // close the PipedOutputStream cleanly
                out.close();
            }
        }
    }
}).start();

파이프된 스트림을 사용하면 다음과 같은 여러 가지 이점을 얻을 수 있습니다.

  • 동시성: 데이터 전송이 별도의 스레드에서 발생하여 병렬 처리가 가능합니다.
  • 메모리 효율성: 파이프형 스트림은 추가 버퍼 복사본 생성을 방지하여 메모리 소비를 줄입니다.

위 내용은 Java에서 OutputStream을 InputStream으로 변환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.