System.out.println("Hello, World");


자바에서는 모든 입출력에서 스트림이라는 개념을 사용하는데, 이것은 C언어와 유닉스에서 온 개념이다. 자바에서는 위와 같은 그림처럼 스트림을 직접 파일에 연결되는 '노드 스트림'과 노드 스트림에 연결하여 다른 처리를 해 주는 '필터 스트림'으로 구분하고 있다.(파일이라고 했지만, 자바에서는 키보드, 모니터, 메모리, 네트워크 상의 리소스도 마찬가지로 취급하고 있다.)

위 그림에서는 노드 스트림과 필터 스트림을 자세히 표현한 그림으로, 역시 바이트 데이터의 저수지(파일이나 키보드 모니터, 메모리, 인터넷 리소스 등)에 직접 연결되어 있는 부분이 노드 스트림이다. 대표적인 입력 노드 스트림은 InputStream 클래스다. 키보드에서 입려을 받는 System.in도 바로 이 InputStream 클래스의 객체다. 대표적인 출력 노드 스트림은 OutoutStream 클래스다. 저수지 데이터로부터 데이터를 하나 가져오면 당연히 노드 스트림을 통하게 된다. 

◎ 입력 스트림

InputStream 클래스는 바이트 단위로 읽기 때문에 한글 등의 이유로 캐릭터 단위로 읽으려면 InputStreamReader 클래스를 연결해서 사용해야 한다. InputStream 클래스는 추상 클래스이기 때문에 바로 사용하는 것은 불가능하고, 반드시 상속받아서 쓰거나 InputStream 클래스의 서브 클래스를 사용해야 한다. 
다음은 InputStream 클래스의 객체인 System.in에 InputStreamReader 클래스의 객체를 연결하여 키보드로부터 문자열을 입력받는 예제다.

InputStreamReaderTest.java

import java.io.IOException;
import java.io.InputStreamReader;

public class InputStreamReaderTest {
	public static void main(String[] args) {
		InputStreamReader in = new InputStreamReader(System.in);		
		try{
			while(true){
				int i=in.read();
			char myChar=(char)i;
			System.out.print(myChar);
		}
	}catch(IOException e){
		System.out.println(e.toString());			
		}
	}
}

◎ FileInputStream과 FileReader
FileInput 클래스는 Input클래스의 서브 클래스로, 파일로부터 바이트 단위로 읽는 입력 스트림이다. 캐릭터 단위로 읽으려면 FIleReader클래스를 사용하면 된다. FileInputStream 클래슨 파일 이름을 바로 적거나 FIle클래스를 사용해서 생성 할 수 있다.

◎ BufferedInputStream과 BufferedReader
BufferedInputStream 클래스는 InputStream 클래스에 버퍼를 추가한 스트림이다. BufferedInputStream 클래스를 사용하면, 프로그램에서 데이터를 읽어올때 요청한 데이터보다 많은 양의 데이터를 미리 버퍼에 읽어 놓았다가 다음 요청때 돌려주기 때문에 프로그램이 기다리는 시간이 줄어들어서 전체적인 수행속도가 빨라 진다. BufferedInputStream 클래스는 필터 스트림이기 때문에 그 자체로는 쓸 수 없고, InputStream 클래스의 객체를 인수로 받아서 생성 해야 한다. 이와 마찬가지로 InputStreamReader클래스에 버퍼를 추가 한 것이 BufferedReader 클래스이다. BufferedReader 클래스를 생성할 때 InputStreamReader 클래스의 객체를 인수로 주면, 버퍼를 사용하면서 캐릭터 단위로 데이터를 읽는 스트림이 생성된다. 

◎ OutputStream과 OutputStreamWriter
OutputStream클래스는 대표적은 출력 스트림이다. OutputStream 클래스는 바이트 단위로 데이터를 출력하기 때문에, 한글과 같은 비영어궈 문자를 출력하려면 캐릭터 단위로 출력하는 OutputStreamWriter 클래스를 연결해서 사용해야 한다. OutputStream 클래스도 InputStream 클래스와 마찬가지로 추상 클래스이기 때문에 바로 사용할수는 없고, 서브 클래스를 사용해야 한다. OutputStream 클래스는 모든 출력 스트림의 슈퍼클래스이기 때문에 OutputStream 클래스의 모든 메소드는 서브클래스에서 사용할 수 있다.

◎ FileOutPutStream과 FilwWriter
FileOutputStream 클래스는 OutputStream 클래스의 서브 클래스로, 파일에 바이트 단위로 출력하는 출력 스트림이다. 캐릭터 단위로 출력하려면 FileWriter 클래스를 사용하면 된다.

◎ BufferedOutputStream과 BufferedWriter
BufferedOutputStream 클래스는 BufferedInputStream 클래스처럼 버퍼 처리를 하는 출력 스트림이다. 프로그램에서 BufferedOutputStream 클래스로 만든 출력 슽림에 출력을 하면, 바로 장치(파일이나 모니터, 네트워크 소켓등)에 출력되지 않고, 메모리의 버퍼에 출력된다. 버퍼가 가득 차면 자동으로 장치에 출력되기 때문에 프로그램이 매번 저장장치에 기록되길 기다리는 OutputStream에 비해 전체적인 수행 속도가 빨라진다.
BufferedOutputStream 클래스는 필터 스트림이기 때문에 그 자체로는 쓸 수 없고, OutputStream 클래스의 객체를 인수로 주어 생성해야 한다. 이와 마찬가지로 OutputStreamWriter 클래스에 버퍼 처리를 한 것이 BufferedWriter클래스다. BufferedWriter 클래스를 생성 할 때 OutputStreamWriter 클래스의 객체를 인수로 주면, 버퍼를 사용하면서 캐릭터 단위로 출력하는 스트림이 생성된다. 

◎ DataOutputStream
입력 스트림인 DataInputStream 클래스의 대응 되는 출력 스트림이 DataOutputStream 클래스다. DataOutputStream 클래스는 자바의 기본 데이터형으로 출력할 수 있도록 해주는 출력 스트림이다. DataInputStream 클래스처럼 DataOutputStream 클래스도 바이트 단위로 데이터를 처리하기 때문에 별로 인듯 하다. DataInputStream 클래스보다는 PrintStream클래스나 PrintWriter클래스를 사용하는 편이 좋다.

◎ PrintStream와 PrintWriter
PrintStream 클래스는 필터 스트림으로 OutputStream 클래스의 객체를 인수로 받아서 생성할 수 있다. PrintStream 클래스는 OutputStrema 클래스의 모든 기능을 단 2개의 메소드인 print()메소드와 println() 메소드로 출력 할 수 있도록 해주는 강력하고 편리한 출력 스트림이다. PrintStream 클래스의 print()메소드와 println()메소드는 메소드 오버로딩을 이ㅛㅇㅇ해서 주어지는 데이터형에 상관없이 출력 할 수 있도록 되어 있다.

Posted by 김마농