-
입출력 스트림(2) / Reader / 예제 소스 분석프로그래밍/JAVA 자바 2021. 8. 24.반응형
package ioEx2; public class Ex04_InputStram { public static void main(String[] args) { // 스피드 가감 int speed = 0; char key; boolean run = true; try { while(run) { do { System.out.println("1.증가 2.감소 3.종료"); key = (char)System.in.read(); System.in.skip(2); } while(key < '1' || key > '3'); switch(key) { case '1' : speed++; break; case '2' : speed--; break; case '3' : run=false; break; } System.out.println("speed : " + speed + "\n"); } } catch (Exception e) { e.printStackTrace(); } } }
소스 분석
- while문은 run이 참일 동안은 계속 반복을 한다.
- while문 안에 do-while문은 key가 '1'보다 작거나 '3'보다 크지 않다면 계속 반복한다.
- do-while문은 무조건 한번은 실행을 한다.
- 번호를 안내 해주는 프린트문을 하나 띄운다.
- key에 1~3사이의 숫자를 넣는다 => char형태로 바뀌어서 key에 들어감
- skip(2)의 의미는 엔터를 읽고 버리기 위해서 이다.
- 만약 1~3사이의 값이 들어 오면 do-while문을 빠져나간다
- switch문으로 들어와서 1이면 스피드 증가, 2감소, 3이면 전체 반복문 탈출(run에 false값 준다.)
- 1이나 2일경우엔 증가나 감소를 한 이후에 출력을 해준다. 그리고 다시 do-while문으로 돌아간다.
OutputStream
package ioEx2; import java.io.OutputStream; public class Ex05_OutputStream { public static void main(String[] args) { // TODO Auto-generated method stub int data = 97; byte [] b = {65,66,67,68,69,70}; try { OutputStream os = System.out; // 아웃풋스트림 = 출력 byte 스트림 os.write(data); // 하위 1바이트 출력. a System.out.println(); os.write(b); // 바이트 배열 출력. ABCDEF System.out.println(); os.write(b, 2, 3); // CDE. 2번째 인덱스에서 3개 출력 System.out.println(); System.out.write(b, 0, b.length); System.out.println(); os.close(); System.out.println("end"); // 출력 안됨 } catch (Exception e) { e.printStackTrace(); } } }
아웃풋스트림의 System.out 객체 os를 만든다. (System.out 출력)
배열 b를 주루륵 출력도 가능
os.write(b, 2, 3); => b 배열에서 2번째 인덱스에서 3개를 출력하겠다.
라는 뜻이다.
System.out.write(b, 0, b.length); => 마찬가지로 b 배열에서 0번째 인덱스(즉 처음)부터 b배열의 길이만큼
출력하겠다.
os.close(); = 객체를 닫아줬으니 그 밑에 프린트문은 출력이 안된다.
아웃풋스트림의 여러가지 출력 방법
package ioEx2; import java.io.OutputStream; public class Ex06_OutputStream { public static void main(String[] args) { // TODO Auto-generated method stub try { OutputStream os = System.out; os.write(65); // 하위 1바이트 출력 //출력 버퍼에 출력되며 출력 버퍼가 꽉 차지 않으면 출력 장치로 안보냄 //그래서 write만 쓰면 출력 안된다. os.write(67); os.write(68); //1번째 방법 os.write(13); os.write(10); // 13과 10은 엔터니까 //2번째 방법 //System.out.println(); // 위의 내용이 출력 됨. //3번째 방법 os.flush(); // 자주 쓴다. //4번째 방법 //os.close(); } catch (Exception e) { e.printStackTrace(); } } }
- 아웃풋스트림 System.out 객체 os 생성
- os 객체에 write를 이용해서 65는 아스키 코드값(A)를 출력 장치 버퍼로 보낸다.
- 마찬가지로 67,과68도 보낸다.
- 이제 출력을 해야한다.
출력 방법
- 엔터의 아스키 값 코드 보내기
(13과 10은 엔터니까 똑같이 출력 장치에 보내면 엔터가 된다. 그럼 출력이 됨)
- 프린트문을 이용해서 출력한다.
- flush()를 이용한다 <- 이 방법을 주로 사용한다.
- 아니면 그냥 os 객체를 close해버려도 출력이 된다.
package ioEx2; public class Ex07_PrintStream_write { public static void main(String[] args) { // System.out = PrintStream 객체 // PrintStream : 다양한 출력이 가능한 출력 스트림(필터 스트림) // IOException이 발생되지 않음. System.out.write(65); // 하위 1바이트를 출력버퍼로 보냄 System.out.write(65); System.out.write(65); System.out.flush(); // 출력버퍼의 내용을 출력 장치로 보냄 } }
- 이 방법은 아웃풋스트림 객체를 이용하지 않은 방법이다.
- 위 코드와 내용은 비슷하다.
- 다만 일일히 System.out을 적어줘야한다.
- 여기서의 출력 방법은 flush()이다.
package ioEx2; import java.io.InputStreamReader; import java.io.Reader; public class Ex08_Reader { public static void main(String[] args) { // TODO Auto-generated method stub int data; char ch; /* * Reader : 문자 입력 스트림. 추상 클래스 * InputStreamReader : byte 스트림을 문자 스트림으로 변환(bridge stream) */ try { Reader rd = new InputStreamReader(System.in); // "ABC엔터" 입력 : 65 66 67 13 10 // "대한엔터" 입력 : 45824 54620 13 10 // 영어, 한글 모두 한번에 한문자씩 입력 System.out.println("입력[ctrl + z = 종료]"); while((data = rd.read()) != -1) { //System.out.println(data); ch = (char) data; System.out.write(ch); //System.out.print(ch); } } catch (Exception e) { e.printStackTrace(); } } }
Reader
문자 입력 스트림이다.
추상 클래스임
InputStreamReader = 바이트 스트림을 문자 스트림으로 바꿈
- Reader의 InputStreamReader 객체 rd를 생성한다.(System.in 이니까 입력 받는거)
- 값을 입력 받는다
- int형 data 변수에 rd.read() ( 입력한 값 ) 을 넣는다.
- 만약 더 읽어올 값이 없거나 ctrl + z 키가 눌렸다면 -1을 반환하고 while문을 탈출한다.
- 값이 있다면 ch에 char형태로 넣는다.
- 그리고 출력한다.
- 단 Reader는 2바이트씩 읽어온다 즉 write는 1바이트씩 출력을 하니까 2바이트인 한글은 깨져서 나온다.
package ioEx2; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.Reader; import java.io.Writer; public class Ex09_Writer { public static void main(String[] args) { // TODO Auto-generated method stub int data; try { // Reader = 문자 입력 스트림 // Writer = 문자 출력 스트림 // OutputStreamWriter = byte 출력 스트림을 문자 출력 스트림으로 변환 Reader rd = new InputStreamReader(System.in); Writer wt = new OutputStreamWriter(System.out); System.out.println("문자열 입력 ctrl+z는 종료"); while( (data = rd.read()) != -1 ) { //read 더이상 읽을 데이터 없으면 -1 반환 wt.write(data); // 하위 2바이트 출력 wt.flush(); } } catch (Exception e) { e.printStackTrace(); } } }
- Reader 문자 입력 스트림(InputStreamReader) 객체 생성
- Writer 문자 출력 스트림(OutputStreamReader) 객체 생성
- Reader 객체 rd를 이용해서 read()한다 = 입력 받겠다.
- 값이 -1 or ctrl + z 면 반복문 탈출
- Writer 객체 wt를 이용해서 입력 받을때마다 출력 버퍼로 전송하고 flush()를 이용해서 바로 출력 한다.
(Writer 의 write는 2바이트 출력이 가능)
(System.out의 write는 1바이트만 출력 가능)
- 이건 Writer의 객체라서 한글도 안깨지고 출력이 된다.
반응형'프로그래밍 > JAVA 자바' 카테고리의 다른 글
입출력 스트림(5) / File (0) 2021.08.24 입출력 스트림(4) / FileCopy / FileWriter / FileReader (0) 2021.08.24 입출력 스트림(1) / InputStream, OutputStream (0) 2021.08.24 Comparable, Collections 정렬 / Map, Properties, Stack, Queue, PriorityQueue, Shuffle, TreeSet (0) 2021.08.03 List / ArrayList / LinkedList / Set (0) 2021.08.01