개발자 미니민의 개발스터디

[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);

 

 

 

 

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기