보조스트림 만들기

Jan 30, 2024
보조스트림 만들기

보조스트림 X, Buffer X 예시

notion image
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); } } }
notion image
이렇게 하나만 나옴. b, c의 데이터는 못 받아서 죽어버림 근데... 쓸 일 없다. buffer해서 쓸거니까!
💡
InputStream은 데이터를 바이트 단위로 읽어오는 기능을 제공
 

보조스트림 O, Buffer X 예시

notion image
notion image
이렇게 한 줄로 줄여서 사용할 수 있다. 이제, 배열을 사용해서 보조스트림을 생성한다.
 
notion image
보조 스트림 생성 완료
 

 
notion image
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); } } }
notion image
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); } } }
notion image
보조스트림도 있고, 버퍼도 있으니 입력된 문자를 다 받음
notion image
💡
OutputStreamWriter는 OutputStream을 문자로 변환하는 역할을 수행하는 보조 스트림
💡
InputStreamReader는 InputStream을 문자로 변환하는 역할을 수행하는 보조 스트림 (=바이트 스트림에서 읽어온 데이터를 문자로 변환하는 역할을 수행하는 보조스트림) InputStream 클래스를 통해 바이트 스트림에서 데이터를 읽어올 수 있다.
 

 
notion image
💡
자바의 기본 버퍼의 크기는 일반적으로 바이트 단위로 지정 즉, 버퍼 사이즈는 8192Byte (자바 입출력 스트림에서 사용되는 기본 버퍼 크기)
 

 
notion image
통신을 하려거든 상대방 컴퓨터의 '소켓'을 'System.in' 자리에 넣으면 됨 * 소켓은 IP 주소와 포트 번호의 조합으로 식별
 

flush()와 readLine ★ (\n 꼭!)

notion image
이렇게 적지 말고, 한줄로 적어라
notion image
💡
쓸 때 : 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); } } }
notion image
정상 작동 되는 것 확인. 하지만 flush를 지워보면?
notion image
notion image
플러시 없으니 작동 불가!!
 

< readLine 예시> = \n (BW의 readLine?)

notion image
notion image
코드를 구분하고 싶으면 \n을 넣어라. \n = enter
notion image
notion image
 

★중요

지금은 내 모니터에서만 띄우지만, 나중에는 상대방 모니터에 보낼거잖아 (통신을 할거니까!!) readLine()은 소비할 때, \n까지만 읽음. 만약 내가 \n 안하면 '안녕반가워' 라고 가겠지? 'readLine'을 안했지? 상대방 입장의 BufferedRead는 readLine()을 가지고 있으니 내가 보낸 메세지를 readLine()으로 읽겠지? 그럼.... 내가 \n을 안 붙여서 보냈으니 안읽어짐. 정확히는 데이터가 가긴 가는데… 그쪽에서 버퍼에 있는걸 꺼내지를 못하는거임 ㅠㅠ 너 이번에 읽을 때, '한 번에 여기까지 읽어!', '딱딱 구분해서 끊어서 읽어!' 하는게 \n임 통신의 모든 것에 다 readLine()이 있음! 통신의 가장 마지막에 리드라인 \n을 꼭 붙여라!
💡
readLine은 통신의 약속이다. 전부 readLine()으로 읽기 때문에 꼭!!! BufferedWriter 할 때, 꼭!!!! \n 을..!! 꼭!!!!
 

 
notion image
이렇게 해버리면 ㅠㅠ 안녕만 읽고 반가워는 영원히 못읽음
 

Input/OutputStream들

notion image
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

codingb