2013년 7월 1일 월요일

(130701) 6일차 InputstreamTest.java (InputStream 테스트, 입출력 연산으로 Scanner를 쓰는 이유)

 - Stream : 데이터들을 주고받을 때 바이트 단위로 주고받는데, 이때 바이트들의 흐름을 스트림이라고 함.
 - Stream의 종류 : Node Stream. Filter Stream
 - Node Stream : 주변 기기에 직접 연결해서 데이터를 바로 뽑아내는 것들. (키보드, 마우스, 디스크 등등)
 - Filter Stream : 데이터를 읽어낸 것을 가공해서 결과물을 얻어내는 것을 말한다.

 - I/O의 종류
InputStream (1byte) : 한글이 깨짐
Reader(2byte) : 한글이 읽힘(unicode)
OutputStream (1byte)
Writer (2byte)

 - InputStream 클래스 :  public abstract class InputStream이므로 객체가 될 수 없음(상속만 받을 수 있음)
 - BufferedInputStream 클래스 : public class BufferedInputStream 이므로 객체가 될 수 있음. 또한 BufferedInputStream(InputStream in) 이므로 BufferedInputStream 객체를 생성하기 위해서 InputStream 생성자를 받아야 함.


 - 소스
import java.io.*;
import java.util.Scanner;

public class InputstreamTest {

public static void main(String[] args) {
// InputStream은 추상클래스이기에 객체를 생성할 수 없다.
// 그래서 시스템 클래스의 in을 이용하여 사용 가능.
InputStream in = System.in; 
int val;
try{
// byte 타입으로 데이터를 읽어드림.
while((val=in.read()) != -1){ // -1이면 다음 byte가 비어있는 상태
System.out.print((char)val); // byte로 읽어왔으므로 char로 형변환
}
} catch(IOException e){
e.printStackTrace();
}
System.out.println();
// Scanner 클래스 때문에 InputStream, Reader 클래스 등등을 배울 필요가 없다.
Scanner sc = new Scanner(System.in);
// 한 단어씩 읽어드림
String data = sc.next();
Scanner sc2 = new Scanner(System.in);
// 한 라인씩 읽어드림
String linedata = sc2.nextLine();
System.out.print(data);
}
}


 - 결과