Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

Everything has an expiration date

172 - Java 자바의 기본 입출력(I/O) : 문자 스트림 입출력, 바이트 스트림 입출력. write() read() 메소드 명은 동일하지만, 매개변수가 무엇이냐에 따라 문자 스트림, 바이트 스트림 달라진다. 본문

[Java]/Java Concepts

172 - Java 자바의 기본 입출력(I/O) : 문자 스트림 입출력, 바이트 스트림 입출력. write() read() 메소드 명은 동일하지만, 매개변수가 무엇이냐에 따라 문자 스트림, 바이트 스트림 달라진다.

Jelly-fish 2023. 9. 25. 15:01
/* ========================================
  ■■■ 자바의 기본 입출력(I/O) ■■■
==========================================*/

/*

자바는 단일 입출력이다 물 줄기처럼 한 방향으로 흐른다.(단방향)
아래의 그림처럼 먼저 들어왔던 것이 먼저 나간다. → First input First Output

in→  -----------
	 --         |
	   |        |
	   |        --- →
	   |        --- out  
	   ---------

스트림 위에 무언가를 띄워서 보낸다...
바깥으로 무언가를 내보내지 못하면(데이터) 안 된다.
먼저 띄워보낸 종이배(데이터)가 나가야만 (blocking)
그 다음에 띄워보낸 종이배가 나갈 수 있다.



문자 input output
바이트 input output 
총 4가지 종류.



--------------------------------------------------------------------------------

○ 자바의 기본 입출력 개요

   - 자바에서의 모든 데이터의 입출력은 『스트림(Stream)』이라는 개념에 의해
     이루어지는데, 『스트림(Stream)』 이라는 단어의 사전적 의미는
	 "흐르는 물"의 개념이며, 이는 연속된 일련의 데이터를 일컫는다.

   - 데이터 입출력 시 모든 데이터를 형태와 관계없이 일련의 흐름으로
     전송을 하는 것이 스트림 입출력 모델의 기본 개념이다.

   - 기본적으로 스트림(Stream)에는
     바이트 기반 스트림과 문자 기반 스트림이 있다.

---------------------------------------------------------------------------------

○ 바이트 스트림(byte-stream) 입출력

   - InputStream 클래스와 OutputStream 클래스, 그리고 이들의 하위 클래스를
     통해서 제공되는 바이트 스트림(byte-stream)을 위한 표준 입출력으로
	 8비트 크기를 갖는 바이트들의 스트림이 입출력된다.
	 (바이트, 바이트배열, 정수 등)


○ 문자 스트림(character-stream) 입출력

   - Reader 클래스와 Writer 클래스, 그리고 이들의 하위 클래스에 의해
     구현되었으며, 8비트 크기를 갖는 바이트들의 스트림이 아닌
	 16비트 크기를 갖는 유니코드 문자들의 스트림이라는 점에서 차이가 있다.
	 (문자, 문자배열, 문자열 등)


 ----------------------------------------------------------------------------------
※ 스트림(stream)의 특징
 ----------------------------------------------------------------------------------

   - 스트림은 FIFO 구조이다.

     FIFO 구조란, 먼저 들어간 것이 먼저 나오는 형태로
	 스트림의 데이터는 순차적으로 흘러가며 순차적 접근 밖에는 허용되지 않는다.

-----------------------------------------------------------------------------------

   - 스트림은 단방향이다.

     자바에서 스트림은 읽기 쓰기가 동시에 이루어지지 않는다.
	 따라서 읽기 쓰기가 필요하다면 읽는 스트림과 쓰는 스트림을
	 하나씩 열어서 사용해야 한다.

-----------------------------------------------------------------------------------

   - 스트림은 지연될 수 있다.

     스트림에 넣어진 데이터는 처리되기 전에는 스트림에 사용하는 스레드는
	 지연(blocking) 상태에 빠진다.
	 네트워크 상에서는 데이터가 모두 전송되기 전까지 스레드는 지연(blocking)
	 상태가 된다.

-----------------------------------------------------------------------------------

★ 바이트 스트림 입출력 - InputStream, OutputStream 클래스 하위 클래스
★ 문자 스트림 입출력 - Reader, Writer 클래스 하위 클래스

*/
// Test174.java 파일과 비교
import java.io.IOException;

public class Test172
{
	public static void main(String[] args) throws IOException
	{
		int data;
		char ch;
		
		// 바이트 기반 입력 받고
		System.out.println("문자열 입력(종료:Ctrl+z)" );
		
		// 한 개의 문자를 읽어오는 System.in.read() → int 타입으로 읽어들임.
		// 문자 하나만 가지고 오는 것이다.
		// 그것을 데이터에 넣고(ASCII Code) -1 이 아니면 (입력되어 있는 값이 null 이면 -1)
		// 입력된 내용만큼 반복문을 돌도록 구성하는 것.

		// read() : InputStream 클래스의 대표적 메소드(→ 바이트 스트림)
		while ((data = System.in.read()) != -1)
		{
			ch = (char)data;

			// 16비트 크기를 갖는 유니코드 문자들의 스트림 → 문자 스트림
			// 문자 하나만 읽어오는 문자 스트림을 사용했을 때는
			// 한글을 입력했을 때 전부 깨져서 출력되는 것을 확인할 수 있다.

			
			// 문자 기반 출력을 하므로 한글이 깨짐.
			//System.out.print(ch);	// (→ 문자 스트림)
			//--==>> 문자열 입력(종료:Ctrl+z)
			//       abcd
			//       abcd
			//       ABCD
			//       ABCD
			//       1234
			//       1234
			//       가나다라
			//       °¡³ª´?¶?
			//       ^Z
			//       계속하려면 아무 키나 누르십시오 . . .
			
			// write() : OutputStream 클래스의 대표적 메소드(→ 바이트 스트림)
			// 8비트 크기를 갖는 바이트들의 스트림이 입출력 → 바이트 스트림
			System.out.write(ch);
			//--==>> 문자열 입력(종료:Ctrl+z)
			//       abcd
			//       abcd
			//       ABCD
			//       ABCD
			//       1234
			//       1234
			//       가나다라
			//       가나다라
			//       ^Z
			//       계속하려면 아무 키나 누르십시오 . . .





		}
	}
}