티스토리 뷰


안녕하세요 박스여우입니다. 오늘은 System.out(표준 출력)의 출력을 두개의 스트림으로 복제하거나 System.out 출력을 후킹하는 방법에 대해 알아보겠습니다.


System.out
우선, Java의 System.out 스트림은 PrintStream 입니다.
PrintStream에 대해 알아보자면 Java의 기본 출력 스트림인 OutputStream을 상속받고 있으며 일반적인 입출력 뿐만 아니라 파일 입출력에도 사용되는 스트림 입니다.

System.setOut을 통해 System.out.print 등의 기본 시스템 출력을 다른 곳으로 돌릴 수 있습니다. 이를 이용해서 System.out 스트림을 후킹해 보도록 하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.io.OutputStream;
import java.io.PrintStream;
 
public class HijackPrintStream extends PrintStream{
    private PrintStream hijackOut;
    public BPoPrintStream(OutputStream out) {
        super(out);
    }
    public OutputStream getOutputStream(){
        return out;
    }
    
    
    public void setHijackStream(OutputStream arg){
        hijackOut = new PrintStream(arg);
    }
    
    @Override
    public void println(String str){
        hijackOut.println(str);
        super.println(str);
    }
    
    @Override
    public void print(String str){
        hijackOut.print(str);
        super.print(str);
    }
    
    @Override
    public PrintStream append(CharSequence csq){
        hijackOut.append(csq);
        return super.append(csq);
    }
 
}
cs


방법은 생각보다 간단합니다. HijackPrintStream으로 PrintStream을 상속받는 새로운 클래스를 만들고, PrintStream으로 부터 상속받은 print, println등과 같은 출력 메소드들을 수정하면 됩니다. 단, 기존의 표준 출력 스트림을 유지하기 위해 super.출력메소드를 사용해야 합니다.


저는 클래스 내부에 setHijackStream메소드를 통해 두번째 PrintStream을 등록해서 사용했습니다.



 System.setOut

이제 만들어진 스트림을 사용하기 위해 등록해 보도록 하겠습니다.


1
2
3
HijackPrintStream out = new HijackPrintStream(System.out);
out.setHijackStream(server.getSoc().getOutputStream());
System.setOut(out);
cs

표준 출력 스트림을 새롭게 만든 HijackPrintStream에 넣고, 두번째 output을 소켓으로 하였습니다.

이후에 System.setOut(out);을 통해 최종적으로 만들어진 HijackPrintStream을 등록하면 끝!

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함