보조스트림 X, Buffer X 예시
package ex15; import java.io.IOException; import java.io.InputStream; public class StreamEx01 { public static void main(String[] args) { InputStream input = System.in; //키보드 try { int value = input.read(); System.out.println("받은 값 : " + value); } catch (IOException e) { throw new RuntimeException(e); } } }
이렇게 하나만 나옴. b, c의 데이터는 못 받아서 죽어버림 근데... 쓸 일 없다. buffer해서 쓸거니까!
InputStream은 데이터를 바이트 단위로 읽어오는 기능을 제공
보조스트림 O, Buffer X 예시
이렇게 한 줄로 줄여서 사용할 수 있다. 이제, 배열을 사용해서 보조스트림을 생성한다.
보조 스트림 생성 완료
package ex15; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class StreamEx02 { public static void main(String[] args) { InputStreamReader ir = new InputStreamReader(System.in); char[] ch = new char[4]; try { ir.read(ch); //보조스트림으로부터 읽는다는 말 //ir은 키보드에 연결되어 있음. //이 객체는 ch라는 보조스트림으로 부터 데이터를 읽겠다 for (char c : ch) { System.out.println(c+ " "); } } catch (IOException e) { throw new RuntimeException(e); } } }
abcdef를 입력해도 보조스트림이 4개라서 최대 4개까지만 표시함. 이 방법도 쓸 일 없다!!! 오늘 하고 치우셈
보조스트림 O, Buffer O 예시 ★ - 보조스트림과 버퍼는 함께 만들어줘라?
package ex15; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class StreamEx03 { public static void main(String[] args) { InputStreamReader ir = new InputStreamReader(System.in); //보조스트림 만드는 코드. //키보드로부터 입력된 데이터를 문자 단위로 읽어들이기 위한 준비 작업 BufferedReader br = new BufferedReader(ir); try { String line = br.readLine(); //Stream타입을 String타입으로 받은 것? System.out.println(line); } catch (IOException e) { throw new RuntimeException(e); } } }
보조스트림도 있고, 버퍼도 있으니 입력된 문자를 다 받음
OutputStreamWriter는 OutputStream을 문자로 변환하는 역할을 수행하는 보조 스트림
InputStreamReader는 InputStream을 문자로 변환하는 역할을 수행하는 보조 스트림
(=바이트 스트림에서 읽어온 데이터를 문자로 변환하는 역할을 수행하는 보조스트림)
InputStream 클래스를 통해 바이트 스트림에서 데이터를 읽어올 수 있다.
자바의 기본 버퍼의 크기는 일반적으로 바이트 단위로 지정
즉, 버퍼 사이즈는 8192Byte (자바 입출력 스트림에서 사용되는 기본 버퍼 크기)
통신을 하려거든 상대방 컴퓨터의 '소켓'을 'System.in' 자리에 넣으면 됨 * 소켓은 IP 주소와 포트 번호의 조합으로 식별
flush()와 readLine ★ (\n 꼭!)
이렇게 적지 말고, 한줄로 적어라
쓸 때 : BufferedWriter / 읽을 때 : BufferedReader
<flush() 예시>
package ex15; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStreamWriter; public class StreamEx04 { public static void main(String[] args) { BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); try { bw.write("안녕"); //write()" 메서드는 "BufferedWriter" 클래스의 메서드 bw.flush(); //반드시 해주기!! 8192바이트가 안찼을테니까! } catch (IOException e) { throw new RuntimeException(e); } } }
정상 작동 되는 것 확인. 하지만 flush를 지워보면?
플러시 없으니 작동 불가!!
< readLine 예시> = \n (BW의 readLine?)
코드를 구분하고 싶으면 \n을 넣어라. \n = enter
★중요
지금은 내 모니터에서만 띄우지만, 나중에는 상대방 모니터에 보낼거잖아 (통신을 할거니까!!) readLine()은 소비할 때, \n까지만 읽음. 만약 내가 \n 안하면 '안녕반가워' 라고 가겠지? 'readLine'을 안했지? 상대방 입장의 BufferedRead는 readLine()을 가지고 있으니 내가 보낸 메세지를 readLine()으로 읽겠지? 그럼.... 내가 \n을 안 붙여서 보냈으니 안읽어짐. 정확히는 데이터가 가긴 가는데… 그쪽에서 버퍼에 있는걸 꺼내지를 못하는거임 ㅠㅠ 너 이번에 읽을 때, '한 번에 여기까지 읽어!', '딱딱 구분해서 끊어서 읽어!' 하는게 \n임 통신의 모든 것에 다 readLine()이 있음! 통신의 가장 마지막에 리드라인 \n을 꼭 붙여라!
readLine은 통신의 약속이다.
전부 readLine()으로 읽기 때문에 꼭!!! BufferedWriter 할 때, 꼭!!!! \n 을..!! 꼭!!!!
이렇게 해버리면 ㅠㅠ 안녕만 읽고 반가워는 영원히 못읽음
Input/OutputStream들
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()) );
* 소켓을 쓰면 socket.getInputStream 을 쓴다.
* 키보드를 달면
new BufferedReader (new InputStreamReader(System.in))) 뭐 이런식으로.. 쓰는 것!
* getinputStream과 inputStream은 같은 것이다. 그냥 inputStream을 가져오는 것!
* BufferedReader, BufferedWriter는 그냥 버퍼
InputStreamReader: InputStream으로부터 문자 데이터를 읽기 위해 사용되는 보조 스트림 (=바이트 스트림에서 읽어온 데이터를 문자로 변환하는 역할을 수행하는 보조스트림) OutputStreamWriter: OutputStream에 문자 데이터를 쓰기 위해 사용되는 보조 스트림
PrintWriter 좋더라
OutputStreamWriter는 문자 스트림을 바이트 스트림으로 변환
= OutputStream을 Writer로 변환해주는 역할
이렇게 변환하면 데이터를 문자 단위로 쓸 수 있게 된다.
= OutputStreamWriter를 사용하여 JSON 데이터를 문자 단위로 쓸 수 있게 되는 것
버퍼는 메모리. RAM에다가 잠깐 넣어 놓는 것
Share article