출력스트림을 입력스트림으로 변환하는 방법
소프트웨어 개발에서 데이터를 변환해야 하는 상황에 직면하는 것은 드문 일이 아닙니다. 유형을 다른 유형으로 스트리밍합니다. 그러한 시나리오 중 하나는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!