티스토리 뷰
자바에는 입출력 스트림이란??
입출력 스트림이란 입력과 출력을 위한 스트림입니다. 입출력 스트림이라고 말하지만
동시에 입출력이 동시에 가능한 스트림은 없고 입력과 출력 따로 나누어 집니다.
입력과 출력 스트림 자료의
종류에는 입력과 출력 그리고 바이트 기반의 스트림과 문자 기반의 스트림으로 나누어집니다.
그리고 스트림의 기능인 기반스트림과 보조스트림으로 나누어 진다고 볼수있습니다.
보조스트림은 자체적으로 뭔가할순없지만 기반스트림을 서포트해서 기능을 추가해주는 방식입니다.
스트림중에 Input에는 FileInputStream과 FileReader 등 종류가 있고
Output 스트림중에는 FileOutputStream과 FileWriter등 종류들이 있습니다
여기서 Input또는 Output Stream이들어간 종류는 바이트 기반이고
Reader 또는 Writer가 들어간것은 문자 기반의 스트림이라고 볼수있습니다.
보조스트림도 마찬가지로 BufferdInputStream과 BufferdOutputStream등은 바이트 기반 보조스트림이고
BufferdReader 또는 BufferdWriter등은 문자기반의 보조 스트림입니다.
자바를 처음 배울때 "Hello Java"를 출력할때 사용하는 System.out.println();기능도 사실 Stream입니다.
System 클래스 내부에 static 멤버로있는 PrintStream을 사용해 출력하는것인데요
깊숙히 알아보면 복잡해서 나중에 따로 다룰수도 있겠지만 평범하게 그냥 사용했던 System.out.println();도
사실 출력 Stream에 한종류라는것을 알아본걸로 만족하겠습니다.
public class SystemInputStreamTest {
public static void main(String[] args) throws IOException {
int i = System.in.read();
System.out.println(i);
System.out.println((char)i);
}
}
위에 코드는 1byte씩 읽어서 i에 대입해 숫자로도 출력하고 char로 형변환을 시켜 문자로도 출력시킨다
하지만 아래 코드를 보면 while문으로 '\n' 엔터키를 만나기전까지에 문자를 출력한다.
public class SystemInputStreamTest {
public static void main(String[] args) throws IOException {
int i;
while( (i = System.in.read()) != '\n') {
System.out.print((char)i + " ");
}
}
}
위에 코드들은 바이트기반이기 때문에 한글은 출력할수없다 그래서 필요한것이 보조스트림인데
보조스트림을 사용하면 한글도 출력가능한데 그코드를 예시로 작성해 보겠습니다.
public class SystemInputStreamTest {
public static void main(String[] args) throws IOException {
int i;
InputStreamReader inputStream = new InputStreamReader(System.in);
while( (i = inputStream.read()) != '끝') {
System.out.print((char)i + " ");
}
}
}
위처럼 보조스트림인 InputStreamReader에 생성자에 System.in을 사용해서 바이트기반의 스트림을
보조 스트림을이용해 문자기반의 스트림으로 기능을 추가해준다음 읽어들이면 한글도 문제없이 출력되는걸 볼수있다.
*(영어 숫자는 1byte 한글은 3byte)이기때문에 byte기반으로는 읽어올수없음*
입출력 스트림에 종류와 보조스트림의 종류도 다양하니까 모두 알순없어서 기본적인것만 알아보고
필요한부분은 그때 그때 찾아서 사용하는것이 좋을꺼 같다.
