많이 쓰는 스트림중에 출력을 위해 존재하는 스트림이 있습니다.

모든 OutputStream의 공통분모인 OutputStream클래스의 경우 출력을 위한 메소드가 겨우

3가지 뿐이어서 꽤 불편합니다. 쓰기를 좀더 자유롭게 제어하고 싶다면 제 1감으로 

PrintWriter, PrintStream등을 사용하면 좋겠습니다.

 

 

import java.io.*;

 

public class PrintOutput {

    public String sayHello(String name) {

        try {

            if (name.equals("장나라"))

                return "사랑해 " + name;

            else if (name.equals("장나리"))

                return "넌 누구니 " + name;

            else

                return "안녕 " + name;

        }

        catch(Exception e) {

        // 디버깅정보로 활용할 수 있는 stack trace 내용을 스트림으로 받음

        // 스트림이 최종적으로는 String으로 대표되는 메모리에 쓰여짐

            StringWriter sw = new StringWriter();

            e.printStackTrace(new PrintWriter(sw));

            return sw.toString();

        }

    }

 

    public static void main(String[] args) {

        PrintOutput po = new PrintOutput();

        System.out.println(po.sayHello("장나라"));

        System.out.println(po.sayHello(null));

        System.out.println(po.sayHello("장나리"));

 

        try {

        // FileWriter PrintWriter로 덧씌움

        // PrintWriter에서 제공하는 메소드를 사용해서 쓰기를 할 수 있습니다.

        // PrintWriter를 이용해서 쓰기를 해도, 그 결과는 FileWriter에 씌여집니다.

            PrintWriter pw = new PrintWriter(new FileWriter("zzangnara.txt"));

            pw.println(po.sayHello("장나라"));

            pw.println(po.sayHello("장나리"));

            pw.close();

        }

        catch(IOException ie) {

            ie.printStackTrace();

        }

    }

}

예제 6 - 8 PrintOutput.java

 

 

PrintOutput클래스에서는 두 가지의 내용을 보여주고 있는데 첫째는 예외 발생시

StackTrace되는 내용을 PrintWriter StringWriter를 이용해서 그 내용을 메모리로

담아내고 있습니다. String StackTrace되는 내용을 담고 있는 거지요.

이렇게 담은 내용을 리턴값으로 돌려주고 있습니다.

일반적으로는 StackTrace되는 내용을 표준 출력(화면)으로 쓰는 경우가 많습니다.

e.printStackTrace() 처럼 말입니다.

 

두번째는 FileWriter를 이용해서 데이터를 파일에 쓰려고 하는데 FileWriter를 그냥

사용하지 않고 PrintWriter로 덮어 씌웠습니다.

참고로 PrintWriter는 모든 Writer를 덮어씌울수 있습니다. 물론 PrintStream은 모든 Stream

을 덮어씌울 수 있지요. 이렇게 덮어 씌움으로써 좋아진 점은 레퍼런스를 PrintWriter로 할

수 있으므로 PrintWriter레퍼런스로 사용할 수 있는 모든 메소드를 사용할 수 있게 된 것

입니다.

 

Writer w = new FileWriter(“zzangnara.txt”);

PrintWriter w = new PrintWriter(new FileWriter(“zzangnara.txt”));

 

2개의 선언이 가지는 차이는 호출할 수 있는 메소드의 개수의 차이입니다.

물론 엄청 차이납니다. Writer는 경우 3가지 메소드 밖에 없지만 PrintWriter

출력전문 출신 답게 엄청 나게 풍부한 메소드를 보유하고 있습니다.

이처럼 출력에 조금 신경을 써야할 때 PrintWriter가 등장하곤 합니다. PrintWriter처럼

다른 Stream을 덮어씌워서 자신이 갖는 장점을 (풍부한 메소드보유)를 활용하는 행동을

Wrapping이라고 합니다. InputStream,Reader,OutputStream,Writer가 보유한 입출력,

메소드는 부실하지만 (개수가 적다는 의미), 예제 6-8 과 같이 자바는 Wrapping을 통해서

입출력의 강력한 기능을 제공하고 있습니다.

 

사용자 삽입 이미지

그림 6 - 7 [ run PrintOutput]

 

 

 

 

Posted by
,