[JAVA] 자바 - 입출력 스트림 (바이트 스트림/문자 스트림/BufferedReader)
by mini_min[JAVA] 자바
- 입출력 스트림 (바이트 스트림/문자 스트림/BufferedReader)
✔️ 입출력 스트림이란?
: 자바의 모든 데이터 입출력은 스트림이라는 개념으로 이뤄진다.
: 스트림은 응용프로그램과 입출력 장치를 연결하는 소프트웨어 모듈!
: 입출력시, 모든 데이터를 형태와의 관계없이 일련된 흐름으로 전송하는 것이 기본 개념이다.
📑 입출력 스트림 종류
- 바이트 스트림 : 1byte 단위로 수행. (기본 입출력 단위)
- 문자 스트림 : 2byte 단위로 입출력 수행
✔️ 입출력 스트림 특징
- 입력 스트림과 출력 스트림으로 구성됨
- 스트림은 FIFO 구조이다. (선입선출)
- 스트림은 단방향이다.
- 스트림은 지연될 수 있다.
✔️ 주요 입출력 예외 클래스
- java.io.IOException
- java.io.FileNotFoundException : 파일 존재하지 않는 경우 발생
- java.io.EOFException : 파일이 스트림 종료에 도달했음을 알리는 예외
💖 바이트 스트림 (Byte Streams)
- 기본 입출력 단위 바이트 (byte) 이다.
- 1 바이트 (8 bit) 단위로 입출력 수행한다.
- 2진 데이터 입출력이 가능하다.
- 해당 클래스는 InputStream 과 OutputStream 의 서브 클래스이다.
💖 문자 스트림 (Character Streams)
- 2바이트 유니코드 문자를 입출력하기 위한 스트림이다.
- 문자 단위로 입출력을 수행한다.
- 모든 문자 스트림 클래스는 Reader 및 Write 클래스의 서브 클래스이다!
📑 Bridge Stream
- 1 바이트 스트림을 2 바이트 스트림으로 변환해주는 스트림이다.
- InputStreamReader 와 OutputStreamWrite 클래스가 있다.
public static void main(String[] args) {
// inputStream : 바이트 입력 스트림
int data;
char ch;
//system.in : InputStream 객체. byte 스트림
//InputStream의 read() : 1바이트를 읽어 ASCII 코드를 반환한다.
//12 (엔터) : 49 50 13 10
// 모든 프로그램은 문자를 받지, 숫자를 받지않는다. 숫자가 나오는건 문자로 받아서 숫자로 바꿔주는 것이다!
// 대한민국 (엔터) : 235 140 128 237 149 156 235 175 188 234 181 173 13 10 (13+10 : 엔터)
try {
System.out.println("문자열[Ctrl+Z: 종료] ? "); //맥은 Ctrl+D
while((data = System.in.read()) != -1) {
ch = (char)data;
//System.out.println(data);
//System.out.write(data); // 한글이 잘 나옴!!!!!!!!!! . 하위 1바이트만 출력함
// write 12번 찍은거임 (대한민국일때)
//System.out.write(ch); // 2바이트 중 하위 1바이트만 출력
System.out.print(ch); //1바이트를 읽어서 2바이트로 출력 (한글 깨짐!!)
}
} catch (Exception e) {
e.printStackTrace();
}
}
💡 read () : 1바이트를 읽어 ASCII 코드를 반환한다.
System.out.write(ch); // 2바이트 중 하위 1바이트만 출력한다. 문자 출력하는 것....
(대한민국 입력시 '대한민국' 그대로 출력)
System.out.print(ch); //1바이트를 읽어서 2바이트로 출력 (한글 깨짐!!)
int data;
try {
System.out.println("ABCDEF 입력 후 엔터 : ");
data = System.in.read(); // 65
System.out.write(data); // 하위 1바이트를 버퍼에 출력.A //write 는 문자 출력하는것
//System.out.println(data); // 65
System.in.skip(2); // 2바이트를 읽어서 버림 BC 읽어서 버림
data = System.in.read(); // 68
System.out.write(data); // D
System.in.skip(4);
// 버퍼의 공간이 꽉 차면 출력이 되는데, 아래 flush 안해주면 출력안된다.
// 왜냐, write 는 버퍼에 하위 1바이트를 출력하는데 꽉 안찼으니까!!
System.out.flush(); // 버퍼의 내용을 출력 장치로 보냄
} catch (Exception e) {
e.printStackTrace();
}
💡 System.in.skip(2); // 2바이트를 읽어서 버림 BC 읽어서 버림
System.out.flush(); // 버퍼의 내용을 출력 장치로 보내서 출력해야한다.
버퍼 공간이 꽉 차지 않았을 때 flush 를 안해주면 출력이 안된다.
결과 : AD
-- OutputStream
OutputStream os = System.out;
os.write(65);
// 하위 1바이트를 출력 버퍼로 보냄. 출력 버퍼가 차지 않으면 출력 안함
os.write(66);
os.write(67);
System.out.flush();
💡 결과 : ABC
OutputStream 에서 write() 는 하위 1바이트를 출력 버퍼로 보냄
✔️ OutputStream : FilterOutputStream > PrintStream
-- System.out : PrintStream 객체
-- PrintStream : 다양한 출력이 가능한 출력 스트림! (필터 스트림) /IO 예외 발생하지않음
OutputStream os = System.out; // 업캐스팅
os.write(b);
System.out.println();
os.write(b, 2, 3); // CDE 출력 (뽑을 값, 위치, 갯수)
System.out.println();
os.write(b, 0, b.length); // CDE 출력 (뽑을 값, 위치, 갯수)
System.out.println();
os.close();
System.out.println("end!"); // 출력 안된다.
💡 OutputStream 에서 write (인자1, 인자2, 인자3)
: (뽑을 값, 위치, 갯수)
-- InputStreamReader : byte Stream 을 문자 스트림으로 변환. (bridge stream)
Reader rd = new InputStreamReader(System.in);
// ABC 엔터 : 65, 66, 67, 13, 10
// 대한민국 엔터 : 45824 54620 48124 44397 13 10 (4번 실행 . 문자 스트림이라서?!)
// 한글 영문자 모두 한 번에 하나의 문자를 입력 받는다. (실제로는 한 번에 하나씩 입력 받는게 아님!)
System.out.println("입력 [Ctrl+Z:종료] ?");
while((data=rd.read())!=-1) {
//System.out.print(data + " ");
ch = (char)data;
System.out.print(ch); //아까는 깨졌음! 지금은 잘 나옴
//write : 한글 깨짐. 2바이트 문자를 1바이트밖에 안찍으니까!
💡 버퍼리더를 사용할 때 본 기억이 난다!
write 를 사용하면 한글이 깨진다. 2바이트 문자를 받았는데 1바이트만 찍으니까
-- OutputStreamWriter
Reader rd = new InputStreamReader(System.in);
Writer wt = new OutputStreamWriter(System.out);
System.out.println("문자열[종료:Ctrl+z] ?");
while((data=rd.read())!=-1) {
wt.write(data); // 하위 2바이트 출력
// 문자 스트림의 write 라서 2바이트 찍음
}
wt.flush();
💡 문자 스트림의 write() 는 하위 2바이트를 버퍼로 보낸다.
-- BufferedReader : 문자 스트림에서 텍스트를 읽고 문자, 배열, 줄을 효율적으로 읽을 수 있도록 버퍼링
-- 바이트를 문자로 읽고 InputStreamReader -> BufferedReader 여기로 넘겨서 한줄씩 읽게 함
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//문자 스트림에서 텍스트를 읽고, 문자, 배열, 줄을 효율적으로 읽을 수 있도록 버퍼링한다.
// 바이트를 문자로 읽음 InputStreamReader -> BufferedReader 여기로 넘겨서 한줄씩 읽게 함
try {
String name;
int age;
System.out.print("이름 ? ");
name = br.readLine();
System.out.print("나이 ? ");
age = Integer.parseInt(br.readLine());
String s = age >= 19 ? "성인" : "미성년자";
System.out.println(s);
'Java' 카테고리의 다른 글
[JAVA] 자바 - 파일 내용 읽어서 콘솔에 출력하기 (0) | 2022.08.29 |
---|---|
[JAVA] 자바 - 파일 처리 (파일 입출력 스트림/파일 복사하기) (0) | 2022.08.28 |
[JAVA] 자바 - 트랜잭션(Transaction) (0) | 2022.08.24 |
[JAVA] 자바 - JDBC CallableStatement 인터페이스 (0) | 2022.08.24 |
[JAVA] 자바 - JDBC PreparedStatement 인터페이스 (0) | 2022.08.22 |
블로그의 정보
개발자 미니민의 개발로그
mini_min