FilterInputStream/FilterOutputStream은 InputStream/OutputStream의 자손이면서 모든 보조스트림의 조상이다. 보조스트림은 자체적으로 입출력을 수행할 수 없기 때문에 기반스트림을 필요로 한다.

protected FilterInputStream(InputStream in)
public	filterOutputStream(OutputStream out)

FilterInputStream/FilterOutputStream의 모든 메서드는 단순히 기반스트림의 메서드를 그대로 호출할 뿐이다. FilterInputStream/FilterOutputStream자체로는 아무런 일도 하지 않음을 의미한다. FilterInputStream/FilterOutputStream은 상속을 통해 원하는 작업을 수행하도록 읽고 쓰는 메서드를 오버라이딩해야한다. 생성자 FilterInputStream(InputStream in)는 접근 제어자가 protected이기 때문에 Filter InputStream의 인스턴스를 생성해서 사용할 수 없고 상속을 통해서 오버라이딩되어야 한다. FilterInputStream/FilterOutputStream을 상속받아서 기반스트림에 보조기능을 추가한 보조스트림 클래스는 다음과 같다.

FilterInputStream의 자손	BufferedInputStream, DataInputStream, PushbackInputStream 등
FilterOutputStream의 자손	BufferedOutputStream, DataOutputStream, PrintStream 등

 

 

 

BufferedInputStream과 BufferedOutputStream

BufferedInputStream/BufferedOutputStream은 스트림의 입출력 효율을 높이기 위해 버퍼를 사용하는 보조스트림이다.

한 바이트씩 입출력하는 것 보다는 버퍼(바이트배열)를 이용해서 한 번에 여러 바이트를 입출력하는 것이 빠르기 때문에 대부분의 입출력 작업에 사용된다.

 

생성자 설명
BufferedInputStream(InputStream in, int size) 주어진 InputStream인스턴스를 입력소스(input source)로하며 지정된 크기(byte단위)의 버퍼를 갖는 BufferedInputStream인스턴스를 생성한다.
BufferedInputStream(InputStream in) 주어진 InputStream인스턴스를 입력소스(input source)로 하며 버퍼의 크기를 지정해주지 않으므로 기본적으로 8192byte 크기의 버퍼를 가젝 된다.

bufferedInputStream의 버퍼크기는 입력소스로부터 한 번에 가져올 수 있는 데이터의 크기로 지정하면 좋다.

프로그램에서 입력소스로부터 데이터를 읽기 위해 처음으로 read메서드를 호출하면, BufferedInputStream은 입력소스로 부터 버퍼 크기만큼의 데이터를 읽어다 자신의 내부 버퍼에 저장한다. 이제 프로그램에서는 BufferedInputStream의 버퍼에 저장된 데이터를 읽으면 되는 것이다. 외부의 입력소스로 부터 읽는 것보다 내부의 버퍼로 부터 읽는 것이 훨씬 빠르기 때문에 그만큼 작업 효율이 높아진다.

 

 

메서드/생성자 설명
BufferedOutputStream(OuputStream out,int size) 주어진 OutputStream인스턴스를 출력소스(outputsource)로하며 지정된 크기(단위byte)의 버퍼를 갖는 BufferedOutputStream인스턴스를 생성한다.
BufferedOutputStream(OutputStream out) 주어진 OutputStream인스턴스를 출력소스(output ource)로하며 버퍼의 크기를 지정해주지 않으므로 기본적으로 8192 byte 크기의 버퍼를 갖게 된다.
flush() 버퍼의 모든 내용을 출력소스에 출력한 다음, 버퍼를 비운다.
close() flush()를 호출해서 버퍼의 모든 내용을 출력소스에 출력하고, bufferedOutputStream인스턴스가 사용하던 모든 자원을 반환한다.

BufferedOutputStream 역시 버퍼를 이용해서 출력소스와 작업을 하게 되는데, 입력소스로부터 데이터를 읽을 때와 반대로, 프로그램에서 write메서드를 이용한 출력이 BufferedOutputStream의 버퍼에 저장된다, 버퍼가 가득 차면, 그 때 버퍼의 모든내용을 출력소스에 출력한다. 그리고는 버퍼를 비우고 다시 프로그램으로부터의 출력을 저장할 준비를 한다.

버퍼가 가득 찼을 때문 출력소스에 출력을 하기 때문에, 마지막 출력부분이 출력소스에 쓰이지 못하고 BufferedOutputStream의 버퍼에 남아있는 채로 프로그램이 종료될 수 있다는 점을 주의해야한다.

따라서 프로그램에서 모든 출력작업을 마친 후 BufferedOutputStream에 close()나 flush()를 호출해서 마지막에 버퍼에 있는 모든 내용이 출력소스에 출력되도록 해야 ㅎ나다.

BufferedOutputStream의 close()는 flush()를 호출하여 버퍼의 내용을 출력스트림에 쓰도록 한 후, BufferedOutputSream인스턴스의 참조변수에 null을 지정함으로써 사용하던 자원들이 반환되게 한다.

 

 

public class BufferedOutputStreamEx1 {
	public static void main(String[] args) {
		try {
			FileOutputStream fos = new FileOutputStream("123.txt");
			BufferedOutputStream bos = new BufferedOutputStream(fos, 5);
			for (int i = '1'; i <= '9'; i++) {
				bos.write(i);
			}

			fos.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

이 예제에서 fos.close()를 호출해서 스트림을 닫아주기는 했지만, 이렇게 해서는 BufferedOutputStream의 버퍼에 있는 내용이 출력되지 않는다. bos.close();와 같이 해서 BufferedOutputStream의 close()를 호출해야 주어진 버퍼에 남아있떤 모든 내용이 출력된다.

 

 

 

3.5 PrintStream

PrintStream은 데이터를 기반스트림에 다양한 형태로 출력할 수 있는 print, println, printf와 같은 메서드를 오버로딩하여 제공한다.

 PrintStream은 데이터를 적절한 문자로 출력하는 것이기 때문에 문자기반 스트림의 역할을 수행한다. 그래서 JDK1.1에서 부터 PrintStream보다 향상된 기능의 문자기반 스트림인 PrintWriter가 추가되었으나 그 동안 매우 빈번히 사용되던 System.out이  PrintStream이다 보니 둘 다 사용할 수밖에 없게 되었다.

PrintStream과 PrintWriter는 거의 같은 기능을 가지고 있지만 PrintWriter가 PrintStream에 비해 다양한 언어의 문자를 처리하는데 적합하기 때문에 가능하면 PrintWriter를 사용하는것이 좋다.

PrintStream은 System클래스의 static멤버인 out과 err, 즉 System.out, System.err이 PrintStream이다.

 

생성자/메서드 설명
PrinStream(File file)
PrinStream(File file, String scn)
PrinStream(OutputStream out)
PrinStream(OutputStream out, boolean autoFlush)
PrinStream(OutputStream out, boolean autoFlush, String encoding)
PrinStream(String fileName)
PrinStream(String fileName, String scn)
지정된 출력스트림을 기반으로 하는 PrintStream인 스턴스를 생성한다. autoFlush의 값을 true로 하면 println메서드가 호출되거나 개행문자가 출력될 때 자동으로 flush된다. 기본값은 false이다.
boolean checkError() 스트림을 flush하고 에러가 발생했는지를 알려 준다.
void print
void print
void print
void print
void print
void print
void print
void print
void print
void println
void println
void println
void println
void println
void println
void println
void println
void println
인자로 주어진 값을 출력소스에 문자로 출력한다.
println메서드는 출력 후 줄바꿈을 하고, print메서드는 줄을 바꾸지 않는다.
void println 줄바꿈 문자(line separator)를 출력함으로써 줄을 바꾼다.
PrintStream printf 정형화된(formatted)출력을 가능하게 한다.
protected void setError() 작업 중에 오류가 발생했음을 알린다.
(setError()를 호출한 후에, checkError()를 호출하면 true를 반환한다.)

print()나 println()을 이용해서 출력하는 중에 PrintStream의 기반스트림에서 IOException이 발생하면 checkError()를 통해서 인지할 수 있다. println()이나 print()는 예외를 던지지않고 내부에서 처리하도록 정의하였는데, 그 이유는 println()과 같은 메서드가 매우 자주 사용되는 것이기 때문이다./

만일 println()이 예외를 던지도록 정의되었다면 println()을 사용하는 모든 곳에 try-catch문을 사용해야 할 것이다.

 

public class PrintStream extends FileOutputStream implements Appendable, Closeable {
	...
	private boolean trouble = false;
	public void print(int i) {
		write(String.valueOf(i));
	}
	private void write(String s) {
		try {
			...
		} catch (IOExcepton x) {
			trouble = true;
		}
}
	...
	public boolean checkError() {
		if(out != null) flush();
		return trouble;
	}
}

i+와 String.valueOf(i)는 같은 결과를 얻집만, String.valueOf(i)가 더 성능이 좋다.

 

printf()는 JDK.15부터 추가된 것으로, C언어와 같이 편리한 형식화된 출력을 지원하게 되었다. printf()에 사용될 수 있는 옵션은 꽤나 다양한데 그에 대한 자세한 내용은 JAVAAPI문서에서 Formatter클래스를 참고하면 된다.

 

format 설명 결과(int i=65)
%d 10진수(decimal integer) 65
%o 8진수(ocrtal integer) 101
%x 16진수(hexadecimal integer) 41
%c 문자 A
%s 문자열 65
%5d 5자리 숫자. 빈자리는 공백으로 채운다    65
%-5d 5자리 숫자. 빈자리는 공백으로 채운다(왼쪽 정렬) 65
%05d 5자리 숫자. 빈자리는 0으로 채운다. 00065

 

 

format 설명 결과(String str = "ABC")
%s 문자열(string) ABC
%5s 5자리 문자열. 빈자리는 공백으로 채운다.   ABC
%-5s 5자리 문자열. 빈자리는 공백으로 채운다.(왼쪽 정렬) ABC

 

 

format 설명 결과(float f = 1234.56789f)
%e 지수형태표현(exponent) 1.234568e+03
%f 10진수(decimal float) 1234.56789
%3.1f 출력될 자리수를 최소 3자리(소수점포함). 소수점 이하 1자리(2번째 자리에서 반올림) 1234.6
%8.1f 소수점이상 최소 6자리. 소수점 이하 1자리.
출력될 자리수를 최소 8자리(소수점포함)를 확보한다. 빈자리는 공백으로 채워진다.(오른쪽 정렬)
  1234.6
%08.1f 소수점이상 최소 6자리, 소수점 이하 1자리.
출력될 자리수를 최소 8자리(소수점포함)를 확보한다. 빈자리는 0으로 채워진다.
001234.6
%-8.1f 소수점이상 최소 6자리, 소수점 이하 1자리
출력될 자리수를 최소 8자리(소수점포함)를 확보한다. 빈자리는 공백으로 채워진다.(왼쪽 정렬)
1234.6
1234.6

 

format 설명
\t 탭(tab)
%n 줄바꿈 문자(new line)
%% %

 

 

format 설명 결과
%tR
%tH:%tM
시분(24시간) 21:05
21:05
%tT
%tH:%tM:%tS
시분초(24시간) 21:05:33
21:05:33
%tD
%tm/%td/%ty
월일년 11/16/15
11/16/15
%tF
%tY-%tm-%td
년월일 2015-11-16
2015-11-16

날짜와 시간에 사용될 수 있는 옵션

+ Recent posts