2021-03-14
Writer은 문자열을 출력하는 최상위 스트림이다. 다만 Writer는 추상 클래스이기 때문에 new 연산자를 통한 객체 생성이 불가하다. 때문에 자식 클래스를 매개 값을 받아 객체를 생성한다. 또한 자바 내에서 바로 문자열로 스트림을 바로 읽어 들일 수 없기 때문에 스트림 기반 출력 클래스 또는 System.out을 형 변환하여 사용해야 한다.
- 선언
Writer wr = new OutputStreamWriter(System.out);
위와 같이 Writer 클래스의 자식 클래스를 매개값으로 받아야지만, new 연산자를 사용한 객체 생성이 가능하다.
- 실행 ( String )
package wWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
public class Main {
public static void main(String[] args) {
Writer wr = new OutputStreamWriter(System.out);
String str = "Hello, Hi";
try {
wr.write(str);
wr.flush();
//writer는 스트링 객체를 전달받아 바로 출력하는게 가능하다.
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
wr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Writer를 이용한 문자열 출력시 write라는 메서드를 사용한다. 위의 코드는 매개 값으로 String 객체를 주고 출력을 진행하였다. 하나의 문자열을 출력한 후 반드시 flush 메서드를 이용해 잔여 버퍼를 비워주어 한다. 반복적인 write 메서드를 사용한다면, 버퍼 공간에 잔여 버퍼가 문자열이 남아있을 수 있어, 개발자의 의도와는 다른 문자열이 출력될 수 도 있기 때문이다.
- 실행 ( char [] )
package wWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
public class Main {
public static void main(String[] args) {
Writer wr = new OutputStreamWriter(System.out);
String str = "Hello, Hi";
char [] buf = str.toCharArray();
// 스트링을 쪼개어 문자배열에 담아준다
try {
for(int i = 0; i < buf.length; i++) {
wr.write(buf[i]);
//writer는 문자배열의 객체를 하나씩 받아 출력
}
wr.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
wr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
write의 매개값으로 char [] 배열을 받을 수도 있다. 이 경우 반복문을 통해 출력할 문자열이 없을 때까지 배열을 돌면서 데이터를 출력하게 된다.
- 실행 ( char [] 길이지정 )
package wWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
public class Main {
public static void main(String[] args) {
Writer wr = new OutputStreamWriter(System.out);
String str = "Hello, Hi";
char [] buf = str.toCharArray();
// 스트링을 쪼개어 문자배열에 담아준다
try {
wr.write(buf,0, buf.length);
//writer는 문자배열의 범위를 지정해 출력할 수도 있다.
wr.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
wr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
사실 배열을 하나씩 순회하는 방법은 전체 문자열의 데이터가 짧을 경우 큰 문제가 없겠지만, 문자열의 양이 방대할 경우 시스템 성능이 많이 저해될 수 있다. 때문에 이경우 입력받은 문자열을 toCharArray() 메서드를 이용해 한번에 char [] 배열에 담은 후 write 메서드를 이용해 전체 배열의 길이를 지정해 한 번에 출력하는 방식을 사용하면 된다.
write([배열 이름], [배열 시작 위치], [배열의 길이]) 순으로 매개 값을 적어주면 된다.
- 결과
위의 3가지 모두 출력하는 문자열의 같기 때문에 console에 출력되는 값 역시 모두 동일하다.