티스토리 뷰
안녕하세요 박스여우입니다. 오늘은 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을 등록하면 끝!
'프로그래밍 > java' 카테고리의 다른 글
java - 스레드 동기화(thread synchronization) (0) | 2016.07.23 |
---|---|
java + cmd 프로세스 아이디 구하고 죽이기, cpu 사용량 구하기 (3) | 2016.06.22 |
객체지향 언어 Java 강좌 #4 - 상속(Extends-확장) (0) | 2016.04.01 |
Java 숫자 규격 맞추기 - Number Format (0) | 2016.03.27 |
AES 암호화/복호화 알고리즘 - Java (0) | 2016.02.08 |
댓글