티스토리 뷰
Stream
연속적인 데이터의 흐름을 의미
Java 응용프로그램과 입출력 장치를 연결해줍니다.
Java 응용프로그램은 입출력 Stream하고만 연결,
Stream이 입출력에 관한 System call을 합니다.
1. 단방향이며 입력과 출력이 정해져있다.
입력스트림은 입력장치만 제어
출력스트림은 출력장치만 제어
2. 선입선출 구조
3. Java의 Stream은 바이트, 문자로 구분
바이트스트림은 바이트단위로 데이터를 다룹니다.
스트림에 들어오고 나가는 데이터를 바이너리로 다루기때문에
모든형식의 데이터를 취급이 가능합니다.
문자스트림은 2byte 유니코드 문자단위로 데이터를 다룹니다.
문자가 아닌정보들은 다룰수없는 특징이 있습니다.
Java Stream의 동작
🌊 InputStream
Byte기반 입력 최상위 클래스입니다.
read : 다음 데이터의 바이트를 읽는다.
skip : InputStream에서 nByte만큼 데이터를 스킵하고 바이트 수 반환
available : 현재 읽을 수 있는 바이트수 반환
close : 현재 열려있는 InputStream을 닫음
mark : InputStream에서 현재위치를 표시
reset : mark를 마지막으로 호출한 위치로 이동
markSupported : 현재 InputStream에서 mark로 표시된 지점이 있는지 여부확인
🌊 OutputStream
Byte기반 출력 최상위 클래스입니다.
close : OutputStream을 닫음
flush : buffer에 남아있는 모든 데이터 출력
write : 버퍼의 내용을 출력
목표 : 한글키보드를 눌러서 System.out.print() method로 그대로 출력하기
System.in을 준비합니다.
System.in?
"표준" 입력 스트림입니다. 이 스트림은 이미 열려 있고 입력 데이터를 제공할 준비가 되어 있습니다. 일반적으로 이 스트림은 키보드 입력 또는 호스트 환경 또는 사용자가 지정한 다른 입력 소스에 해당합니다.
키보드 입력을 받을수 있는 입력스트림입니다.
InputStream is = System.in;
int data;
while ((data = is.read()) != -1) {
System.out.print((char) data);
}
입력값: 안녕하세요
출력값: ìë
íì¸ì
입력값: hello
출력값: hello
in에 할당된 Stream으로는 Byte단위로 입력데이터를 가져오네요.
영문은 1Byte내로 표현이 가능하여 정상출력이 되지만
한글은 2Byte가 필요합니다.
그리고 적절한 문자집합과 인코딩방식을 제공해줘야할 것 같습니다.
InputStreamReader를 사용하겠습니다.
InputStreamReader?
InputStreamReader는 바이트 스트림에서 문자 스트림으로 이어지는 브리지입니다. 바이트를 읽고 지정된 문자 집합을 사용하여 문자로 디코딩합니다. 사용하는 문자 집합은 이름으로 지정하거나 명시적으로 지정하거나 플랫폼의 기본 문자 집합을 허용할 수 있습니다.
InputStreamReader의 read() 메서드 중 하나를 호출할 때마다 기본 바이트 입력 스트림에서 하나 이상의 바이트를 읽을 수 있습니다. 바이트를 문자로 효율적으로 변환할 수 있도록 현재 읽기 작업을 충족하는 데 필요한 것보다 더 많은 바이트를 기본 스트림에서 미리 읽을 수 있습니다.
효율성을 극대화하려면 버퍼링된 판독기 내에서 InputStream 판독기를 래핑하는 것이 좋습니다
"문자 집합과 인코딩 방식을 선택하고 문자를 논리적 단위로 사용한다." 정도로 읽힙니다.
InputStreamReader reader = new InputStreamReader(System.in);
int data;
System.out.println(reader.getEncoding()); // UTF-8 출력
while ((data = reader.read()) != -1) {
System.out.print((char) data);
}
이제 "안녕하세요", "hello" 둘다 정상 출력이 됩니다.
'Java & Kotlin' 카테고리의 다른 글
Java NIO (0) | 2022.12.11 |
---|---|
Java Buffer (0) | 2022.12.11 |
Java annotation (0) | 2022.12.10 |
Java enum (0) | 2022.11.02 |
Java Thread (0) | 2022.10.30 |
- Total
- Today
- Yesterday
- 관계설정
- 백준 제로
- 스타트업
- boot
- ㅃ
- 문제
- jre11
- jvm
- java8
- 다대일
- 알고리즘
- boot 일대다
- jre
- jre8
- JPA
- JDK8
- 개발자채용
- 프로그래머
- jdk11
- mappedby
- 백엔드
- 백준
- Spring
- 코딩테스트
- 자사서비스
- JDK
- 스택
- springboot
- 자바
- 백준 제로 자바
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |