programing

콘솔 출력을 Java의 문자열로 리디렉션

nasanasas 2021. 1. 6. 08:25
반응형

콘솔 출력을 Java의 문자열로 리디렉션


반환 유형이 VOID 이고 콘솔에 직접 인쇄되는 함수가 하나 있습니다 .

그러나 작업 할 수 있도록 해당 출력이 문자열로 필요합니다.

반환 유형이 VOID 인 함수로 변경할 수 없으므로 해당 출력을 문자열로 리디렉션해야합니다.

JAVA에서 어떻게 리디렉션 할 수 있습니까?

stdout을 문자열로 리디렉션하는 것과 관련된 많은 질문이 있지만 일부 기능의 출력이 아닌 사용자로부터 가져온 입력 만 리디렉션합니다.


함수가로 인쇄중인 경우 System.out사용자가 제공 한로 이동하도록 System.setOut변경 하는 방법을 사용하여 해당 출력을 캡처 할 수 있습니다. 연결된 파일을 만드는 경우 출력을 .System.outPrintStreamPrintStreamByteArrayOutputStreamString

예:

// Create a stream to hold the output
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
// IMPORTANT: Save the old System.out!
PrintStream old = System.out;
// Tell Java to use your special stream
System.setOut(ps);
// Print some output: goes to your special stream
System.out.println("Foofoofoo!");
// Put things back
System.out.flush();
System.setOut(old);
// Show what happened
System.out.println("Here: " + baos.toString());

이 프로그램은 한 줄만 인쇄합니다.

Here: Foofoofoo!

다음은 ConsoleOutputCapturer라는 유틸리티 클래스입니다. 출력을 기존 콘솔로 이동할 수 있지만 장면 뒤에서 출력 텍스트를 계속 캡처합니다. 시작 / 중지 방법으로 캡처 할 내용을 제어 할 수 있습니다. 즉, start를 호출하여 콘솔 출력 캡처를 시작하고 캡처가 완료되면 start-stop 호출 사이의 시간 창에 대한 콘솔 출력을 보유하는 String 값을 반환하는 stop 메서드를 호출 할 수 있습니다. 이 클래스는 스레드로부터 안전하지 않습니다.

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.Arrays;
import java.util.List;

public class ConsoleOutputCapturer {
    private ByteArrayOutputStream baos;
    private PrintStream previous;
    private boolean capturing;

    public void start() {
        if (capturing) {
            return;
        }

        capturing = true;
        previous = System.out;      
        baos = new ByteArrayOutputStream();

        OutputStream outputStreamCombiner = 
                new OutputStreamCombiner(Arrays.asList(previous, baos)); 
        PrintStream custom = new PrintStream(outputStreamCombiner);

        System.setOut(custom);
    }

    public String stop() {
        if (!capturing) {
            return "";
        }

        System.setOut(previous);

        String capturedValue = baos.toString();             

        baos = null;
        previous = null;
        capturing = false;

        return capturedValue;
    }

    private static class OutputStreamCombiner extends OutputStream {
        private List<OutputStream> outputStreams;

        public OutputStreamCombiner(List<OutputStream> outputStreams) {
            this.outputStreams = outputStreams;
        }

        public void write(int b) throws IOException {
            for (OutputStream os : outputStreams) {
                os.write(b);
            }
        }

        public void flush() throws IOException {
            for (OutputStream os : outputStreams) {
                os.flush();
            }
        }

        public void close() throws IOException {
            for (OutputStream os : outputStreams) {
                os.close();
            }
        }
    }
}

참조 URL : https://stackoverflow.com/questions/8708342/redirect-console-output-to-string-in-java

반응형