[JAVA]22일차,23일차(자바의 기본 입출력(I/O))

정효진·2021년 8월 13일
0

Developer Study

목록 보기
44/47
post-thumbnail

8월13일(금)

Test160~Test168
Test168~Test173

◼ 자바의 기본 입출력(I/O)

바이트기반 스트림 / 문자기반스트림 으로 나뉨

  • 입력(input) 바이트기반 스트림(밖에 수도꼭지)
  • 입력(input) 문자기반 스트림(밖에 수도꼭지)
  • 출력(output) 바이트기반(내부에 수도꼭지)
  • 출력(output) 문자기반(내부에 수도꼭지)

수제비처럼 하나씩하나씩 떼서 넣고 하나씩하나씩 나오고

임시적으로 물을 저장해놓을 수 있는 버퍼가 달려있는 스트림이있음(주사기처럼 차면 밀어놓고)
버퍼되어있는 물줄기 / 버퍼되어있지 않은 물줄기

이것도 바이트기반 스트림 / 문자기반스트림 으로 나뉨

  • 입력(input) 바이트기반에 버퍼 달려있는것
  • 입력(input) 문자기반에 버퍼가 달려있는것
  • 출력(output) 바이트기반에 버퍼 달려있는것
  • 출력(output) 문자기반에 버퍼가 달려있는것

이제 그럼 알아할 것은!!
수도꼭지 트는 방법
수도꼭지 잠그는 방법
하나하나떠서 그스트림에 올리는 방법
스트림에 있는걸 끄집어 내는 방법
바이트기반 스트림할떼 주의할점
문자기반 스트림할떼 주의할점
이거 보면 끝

▪ 자바의 기본 입출력 개요

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

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

  • 기본적으로 『스트림(stream)』에는
    바이트 기반의 스트림과, 문자 기반의 스트림이 있다.

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

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

▪ 문자 스트림(chrarcter-stream) 입출력

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

※ 스트림의 특징

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

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

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

▪ read() : InputStream 클래스의 대표적 메소드 코드📝

// Test170.java 파일과 비교~!!!

import java.io.IOException;

public class Test168
{
	public static void main(String[] args) throws IOException
	{
		int data;
		char ch;

		System.out.println("문자열 입력(종료:Ctrl+z)");

		// read() : InputStream 클래스의 대표적 메소드(→ 바이트 스트림)
		while ((data = System.in.read()) != -1)  //null 이 아니라면           //-- System.in.read때문에  IOException
		{
			ch = (char)data;
			System.out.print(ch);
			/*
			문자열 입력(종료:Ctrl+z)
			abcd
			abcd
			1234
			1234
			가나다라
			°¡³ª´?¶?
			^Z
			계속하려면 아무 키나 누르십시오 . . .
			*/

			//write() : OutputStream 클래스의 대표적 메소드(→ 바이트 스트림)
			System.out.write(ch);
			/*
			문자열 입력(종료:Ctrl+z)
			abcd
			abcd
			1234
			1234
			가나다라
			가나다라
			^Z
			계속하려면 아무 키나 누르십시오 . . .
			*/
		}

	}
}

▪ OutputStream 코드📝

import java.io.OutputStream;
import java.io.IOException;

public class Test169
{
	//public static void main(String[] args)  throws IOException;    -> error: missing method body, or declare abstract 발생함!
	public static void main(String[] args)  throws IOException
	{
		// System.in  :  자바의 표준 입력 스트림(바이트 기반)
		// System.out :  자바의 표준 출력 스트림
		
		OutputStream out = System.out;

		byte[] ch = new byte[3];

		ch[0] = 65;    // A
		ch[1] = 97;    // a
		ch[2] = 122;   // z

		out.write(ch);  //-- 밖으로 내보낼 데이터(변수)를 스트림에 기록

		out.flush();    //-- 기록된 스트림을 내보내는(밀어내는) 기능을 수행
						//   지금은 Buffer 를 활용하지 않고 있는 상황이기 때문에
						//   생략이 가능한 코드
						//   (Buffered 되어 있는 스트림(stream)일 경우 생략 불가)

		out.close();    //-- 출력 스트림(물줄기)에 대한 리소스 반납
						//   (out 스트림(수도꼭지를 잠가버린 상황)
		
		System.out.println("절대적인 신뢰를 갖고 있는 구문...");    //밖으로 나가는 물줄기를 잠궈버려서 출력안됨!! out.close()
		//-- 『out.close()』를 작성한 이후 출력되지 않는 구문
		//    출력되는 스트림(물줄기)을 닫았기 때문에...

	}
}

▪ Reader 코드📝

// Reader 실습
// Test168.java 파일과 비교~!!!

import java.io.Reader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Test170
{
	public static void main(String[] args) throws IOException
	{
		int data;
		char ch;


		//System.in          : 자바 표준 입력 스트림 -> 바이트 기반 스트림
		//InputStreamReader  : 바이트 기반 스트림을 -> 문자 기반 스트림으로
		//						변환해주는 역할 수행
		//Reader			 : 문자 기반 스트림 객체
		Reader rd = new InputStreamReader(System.in);
	//  ----- 문자      --------번역-----  --------바이트

		System.out.println("문자열 입력(종료:Ctrl+z)");

		while ((data = rd.read()) != -1)
		{
			ch = (char)data;
			//System.out.write(ch);
			/*
			문자열 입력(종료:Ctrl+z)
			abcd
			abcd
			1234
			1234
			가나다라
			 섆|
			^Z
			계속하려면 아무 키나 누르십시오 . . .
			*/

			System.out.print(ch);
			/*
			문자열 입력(종료:Ctrl+z)
			abcd
			abcd
			1234
			1234
			가나다라
			가나다라
			^Z
			계속하려면 아무 키나 누르십시오 . . .
			*/
		}

	}
}

▪ Buffer 코드📝

public class Test171
{
	public static void main(String[] args)
	{
		//System.out : 자바 기본 출력 스트림   -> 여기엔 기본적으로 버퍼가 포함되어있음

		System.out.write(65);    //--'A'
		System.out.write(66);    //--'B'

		System.out.write(180);
		System.out.write(235);   //-- 180 + 235 = '대'

		System.out.flush();
		//-- 현재 구문에서는 생략 불가~!!!

		// 출력 버퍼가 채워지지 않으면
		// 출력할 데이터(자료)를 출력 디바이스(장치)로 보내지 않기 때문에
		// flush() 메소드를 통해 아직 다 채워지지 않은
		// 출력 버퍼의 내용을 출력장치로 밀어내어 보낼 수 있도록 처리해야 한다.
	}
}

▪ Reader Writer 코드📝

// Reader Writer 실습

import java.io.InputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.OutputStreamWriter;
import java.io.Writer;

public class Test172
{
	public void process(InputStream is)   //InputStream  바이트기반의 입력 스트림
	{ 
		int data;

		System.out.println("문자열 입력(종료 : Ctrl+z)");

		try
		{
			//매개변수 is 라는 바이트기반 객체(InputStream)fmf
			//문자 스트림으로 변환하여
			//(-> InputStreamReader 가 수행)
			//Reader 타입의 rd 에서 참조할 수 있도록 처리
			Reader rd = new InputStreamReader(is);   //is 는 System.in으로 넘겨준 InputStream 을 번역해서(인풋 스트림리더) 문자열로

			
			//바이트 기반 스트림인 자바 기본 출력 스트림(System.out)을
			//문자 스트림으로 변환하여
			//(-> OutputStreamWriter 가 수행)
			//Writer 타입의 wt 에서 참조할 수 있도록 처리
			Writer wt = new OutputStreamWriter(System.out);     //아웃풋스트림롸이터 바이트기반을 문자기반으로 바꿔주는 것

			while ( (data = rd.read()) != -1)
			{
				wt.write(data);   //-- 스트림 물줄기에 기록             //출력스트림을 쓰겠다  문자열기반
				wt.flush();       //-- 기록한 스트림을 밀어내어 내보냄  //출력스트림을 밀어내겠다 문자열기반
			}


		}
		catch (IOException e)
		{
			System.out.println(e.toString());
		}
	}


	public static void main(String[] args)
	{
		Test172 ob = new Test172();
		ob.process(System.in);   //System.in 바이트기반의 입력 스트림
	}
}

/*
문자열 입력(종료 : Ctrl+z)
abcd
abcd
1234
1234
가나다라
가나다라
^Z
계속하려면 아무 키나 누르십시오 . . .
*/
profile
개발새발

0개의 댓글