티스토리 뷰

1.    콘솔 ( Console )

-      시스템을 사용하기 위해서 키보드로 입력을 받고 화면으로 출력하는 소프트웨어

-      Unix, Linx : 터미널 , Window : 명령 프롬프트, Power shell, 이클립스 : Console

-       + 운영체제는 프로그램이 구동될 때, 아래의 3가지 자원을 무조건 할당한다!

-       + (1) 표준 출력 ( Standard Output ) : 콘솔에 로그 출력 기능 제공

-       +  - - - - - - - - > System.out

-       + (2) 표준 입력 ( Standard Input ) : 키보드의 입력을 받을 수 있는 기능 제공

-      +  - - - - - - - - > System.in

-       + (3) 표준 에러 ( Standard Error ) : 프로그램에서 발생한 오류를 출력시키는 기능

-      +  - - - - - - - - > System.err

-       + 이는 운영체제의 기능이다. ( 모든 운영체제가 공통적으로 해당된다. )

-       + 3가지 자원은 정적멤버에 속하는 정적 필드이다.

-       + 바이트기반 / 문자기반의 모든 입력과 출력 스트림의 read / write 메소드는 기본 성질이 바로 Blocking이다.

-       + , 읽거나 출력하기 전까지는 Blocking해버리겠다는 의미이다.

 

2.    콘솔 입력 ( System.in 필드 )

-      InputStream 타입의 입력 스트림이기에 InputStream 변수를 대입할 수 있다.

-      읽는 byte는 키보드의 아스키 코드를 받아 들인다.

-      아스키 코드로부터 문자를 변환하게 되는 것이다.

-      Read( ) 메소드의 경우에는 1바이트씩 읽는데, 한글은 2바이트이기에 오류가 발생할 수 있다.

-      이를 해결하기 위해서는 전체 내용을 바이트 배열로 받아 String 객체를 생성 후에 읽으면 해결할 수 있다.

-      Ex. int commentBytes = is.read(datas);

-      Ex. String comment = new String( datas, 0, commentBytes - 2 );

 

3.    콘솔 출력 ( System.out )

-      PrintStream 타입의 출력 스트림으로 OutputStream으로 타입 변환이 가능하다.

-      아스키 코드를 출력하면, 콘솔에는 해당하는 문자가 출력이 되도록 되어 있다.

-      문자열을 출력하려면, 바이트 배열(바가지)을 얻어야 한다.


더보기

01. OutputStream

package outpurstream_write;

import java.io.FileOutputStream;
import java.io.OutputStream;

public class WriteExample6 {
	
	public static void main(String [] args) throws Exception { // OutputStream 4
		
		// 자원객체
		OutputStream os = new FileOutputStream("C:/Temp/TTT2.txt");
		// 파일이 열리는 순간 파일에 영향을 준다. 만약 true를 작성하지 않는다면 일단 기존 내용을 삭제하는 영향을 줄 수 있다.(***)
		
		byte [] data = "ABC".getBytes();
		
		os.write(data,1,2);
		
		os.flush();
		os.close();
		
	} // main

} // end class

더보기

02. OutputStream - ( try - catch - finally )

package outpurstream_write;

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

public class WriteExample7 {
	
	public static void main(String [] args) { // OutputStream 4  - try - catch - finally
		
		// 자원객체
		OutputStream os = null; // (****)
		// 미리 초기화시켜야지 finally블록에서 사용할 수 있다.
		// try 블록내에서 선언/정의하게 되면 finally 블록에서 사용할 수 없다.
		
		try {
			os = new FileOutputStream("C:/Temp/TTT2.txt",true);
			byte [] data = "ABC".getBytes();
		
			os.write(data,1,2); // 인덕스 번호 1번부터 2번까지 출력해라!
			os.flush(); // flush는 write까지 성공해야지 시행되어야 하기 때문에 finally블록에 들어가지 않는다.
		
		} catch ( Exception e ){
			
			e.printStackTrace();
			
		} finally{
			
			try {
				os.close(); // close는 파일이 열린 순간 무조건 닫아야 하기 때문에 finally 블록에 있어야 한다.
			} catch( IOException e ) {
				e.printStackTrace();
			} // inner try catch
			
		} // try - catch - finally
		
	} // main

} // end class

더보기

03. OutputStream - ( try - with - resources )

package outpurstream_write;

import java.io.FileOutputStream;
import java.io.OutputStream;

public class WriteExample8 {
	
	public static void main(String [] args) { // OutputStream 4 - try - with - resource ( 신버전 )
		
		try { 
			
			OutputStream os = new FileOutputStream("C:/Temp/TTT2.txt");
			
			try (os;){
				byte [] data = "ABC".getBytes();
		
				os.write(data,1,2); // 인덕스 번호 1번부터 2번까지 출력해라!
				os.flush();
			} // inner - try
			
		} catch( Exception e ){
			e.printStackTrace();
		} // try - with - resource
		
	} // main

} // end class

더보기

04. OutputStream - ( @Cleanup )

package outpurstream_write;

import java.io.FileOutputStream;
import java.io.OutputStream;

import lombok.Cleanup;

public class WriteExample9 {
	
	public static void main(String [] args) { // OutputStream 4 - @Cleanup 버전

		try{ 
			
			@Cleanup("close")
			OutputStream os = new FileOutputStream("C:/Temp/TTT2.txt",true);
		
			byte [] data = "ABC".getBytes();
		
			os.write(data,1,2);
			os.flush();
		
		} catch( Exception e ) {
			e.printStackTrace();
		} // try - catch
		
	} // main

} // end class

더보기

05. OutputStream - ( try - with - resources ) 2

package outpurstream_write;

import java.io.FileOutputStream;
import java.io.OutputStream;

public class WriteExample10 {
	
	public static void main(String [] args) { // OutputStream 4 - try - with - resource ( 구버전 )
		
		// 예외가 발생하든 발생하지 않든 블록이 끝나면 자원을 닫게 해준다.
		
		try ( OutputStream os = new FileOutputStream("C:/Temp/TTT2.txt"); ){ 
			
			byte [] data = "ABC".getBytes();
		
			os.write(data,1,2); // 인덕스 번호 1번부터 2번까지 출력해라!
			os.flush();
			
		} catch( Exception e ){
			e.printStackTrace();
		} // try - with - resource
		
	} // main

} // end class

더보기

06. Reader - 문자 기반 입력 스트림

package reader_read;

import java.io.FileReader;
import java.io.Reader;


public class ReadExample {
	
	public static void main (String[] args) throws Exception { // 문자기반 입력 스트림
		
		// 객체 생성
		Reader reader = new FileReader("C:/Temp/TTT.txt");
		
		int readData;
		
		while(true) {
			
			readData = reader.read(); 
			// read는 character타입(2바이트)로 읽지만 int타입으로 반환되는데, 이는 문자가 데이터 손상없이 가져오기 위해서이다.
			
			if( readData == -1 ) { // EOF( End Of File )의 값이 -1 
				break;
			} // if
			
			System.out.print((char)readData); // int 타입으로 받이왔기에 char타입으로 강제형변환
			// 출력 : 홍길동  ABCABC
			
		} // while
		
		reader.close(); // 사용이 끝나면 꼭 자원을 닫아야 한다. (****)
		
	} // main

} // end class

더보기

07. Reader - 바가지로 읽기

package reader_read;

import java.io.FileReader;
import java.io.Reader;

public class ReadExample2 {
	
	public static void main (String [] args ) throws Exception { // 문자기반 입력스트림 - 바가지로 읽기
		
		Reader reader = new FileReader("C:/Temp/TTT.txt"); // 문자 기반이기에 텍스트 파일만 가능하다.
		
		int readCharNo;
		
		char [] cbuf = new char [2]; // 2사이즈의 바가지 준비 ( 문자를 읽어내는 바가지이기에 char타입이다. )
		
		String data = ""; // 읽어낸 데이터를 하나로 뭉치기 위해서
		
		while(true) { 
			
			readCharNo = reader.read(cbuf); // 바가지로 읽기
			
			// 탈출 조건
			if( readCharNo == -1 ) { // EOF 
				break;
			} // if
			
			data += new String(cbuf,0,readCharNo); // 바가지로 읽은 부분을 계속 data에 붙인다.
//			 public String(char value[], int offset, int count)
			
		} // while
		
		System.out.println(data);
		// 출력 : 홍길동  ABCABC
		
		reader.close();
		
	} // main

} // end class

더보기

08. Reader - 바가지로 읽기 + 문자집합 설정

package reader_read;

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.nio.charset.Charset;
import java.util.Arrays;

public class ReadExample3 {
	
	public static void main (String [] args ) throws Exception { // 문자기반 입력스트림 - 바가지로 읽기
		
		Charset utf8 = Charset.forName("UTF-8"); // UTF-8로 문자 세팅(***)
		
		Reader reader = new FileReader("C:/Temp/TTT.txt",utf8); // 문자 기반이기에 텍스트 파일만 가능하다.
		
//		 public FileReader(String fileName, Charset charset) throws IOException
		
		int readCharNo;
		
		char [] cbuf = new char [4]; // 2사이즈의 바가지 준비 ( 문자를 읽어내는 바가지이기에 char타입이다. )
		
		readCharNo = reader.read(cbuf,0,cbuf.length);
//		public abstract int read(char[] cbuf, int off, int len) throws IOException;
		
		System.out.println(Arrays.toString(cbuf));
		// 출력 : [홍, 길, 동,  ]
		
		reader.close();
		
	} // main

} // end class

더보기

09. Reader - @Cleanup

package reader_read;

import java.io.FileReader;
import java.io.Reader;
import java.nio.charset.Charset;
import java.util.Arrays;

import lombok.Cleanup;

public class ReadExample4 {
	
	public static void main (String [] args ) { // 문자기반 입력스트림 - 바가지로 읽기 ( 수정 버전 )
		
		try { 
			Charset utf8 = Charset.forName("UTF-8"); // UTF-8로 문자 세팅(***)
			
			@Cleanup
			Reader reader = new FileReader("C:/Temp/TTT.txt",utf8); // 문자 기반이기에 텍스트 파일만 가능하다.
		
			int readCharNo;
		
			char [] cbuf = new char [4]; // 4사이즈의 바가지 준비 ( 문자를 읽어내는 바가지이기에 char타입이다. )
		
			readCharNo = reader.read(cbuf,0,cbuf.length); // 1번만 읽는 것! ( Not 반복 )
			// 이때 readCharNo는 실제로 읽은 문자열의 개수를 의미한다.
			// cbuf.length는 읽을 개수를 정해주지만 바가지 크기 이상으로는 불가능하다.
			// while문을 사용해야지만 전부 출력이 가능하다!! 코드를 자세히 뜯어 보자!! (***)
		
			System.out.println(Arrays.toString(cbuf));
			
		}catch(Exception e) {
			e.printStackTrace();
		} // try - catch
		
	} // main

} // end class

더보기

10. 운영체제 기능

package reader_read;

import java.io.IOException;

public class TTT {

	public static void main (String [] args) throws IOException { // 운영체제 기능
		
//		System.in		// InputStream - 바이트 기반 입력 스트림
//		System.out		// PrintStream - 바이트 기반 출력 스트림
//		System.err		// PrintStream - 바이트 기반 출력 스트림
		
		System.out.println("표준출력"); // 출력 :표준출력
		System.err.println("표준에러"); // 붉은 색으로 표준에러라고 출력된다.
		
		// 표준 출력과 표준 에러를 구분하기 위해서 출력되는 문자의 색이 다르게 나온다.
		
		int keyCode = System.in.read(); 
		// 표준 입력(System.in)*** - 콘솔창에서 입력을 받고 이를 int로 반환
		
		System.out.println("keyCode : " + keyCode);
//		A // 입력
//		keyCode : 65 // 출력
				
	} // main
	
} // end class

더보기

11. System.in

package syserr;

import java.io.IOException;
import java.io.InputStream;

public class SystemInExample {
	
	public static void main (String[] args) throws IOException { // (****)
		
		System.out.println(" == 메뉴 == ");
		System.out.println("1. 예금 조회");
		System.out.println("2. 예금 출금");
		System.out.println("3. 예금 입금");
		System.out.println("4. 종료 하기");
		
		System.out.print("메뉴를 선택하세요 : ");
		
		InputStream is = System.in; // System.in은 키보드의 입력을 받을 수 있는 기능을 가지고 있다. ( 키보드로 입력 받겠다는 의미 )
		char inputChar = (char) is.read(); // read가 키보드의 입력을 받을때까지 blocking해버리는 기능을 가지고 있다.
		
		// read는 읽을 데이터가 있어, 이를 읽을 때가지 blocking해버리는 성질을 가지고 있다.
		// 이러한 blocking으로 인해 장애가 나타날 수도 있는데, 이경우에는 예외로 표시가 되지 않기에 찾아내기 힘들다.
		
		switch ( inputChar ) {
		
			case '1' :
				System.out.println("예금 조회를 선택하셨습니다.");
				break;
			
			case '2' :
				System.out.println("예금 출금을 선택하셨습니다.");
				break;
				
			case '3' :
				System.out.println("예금 입금을 선택하셨습니다.");
				break;
				
			case '4' :
				System.out.println("종료 하기를 선택하셨습니다.");
				break;
				
		} // switch
		
	} // main

} // end class

더보기

12. System.in 2

package syserr;

import java.io.IOException;
import java.io.InputStream;

public class SystemInExample2 {
	
	public static void main (String[] args) throws Exception { // System.in (****)
		
		InputStream is = System.in;
		
//		==========================================================
		
		// 영문 / 숫자를 입력받기 위한 배열이라면, 100문자를 입력받을 수 있지만
		// 한글은 자바언어에서 2바이트로 표현되기 때문에, 배열 크기의 절반인 최대 50문자의 한글을 입력받을 수 있다.
		
		byte [] datas = new byte [100]; // 바가지를 이전과는 다르게 약간 크게 만들었다.
		
//		==========================================================
		
		System.out.print("이름 : "); // prompt 메세지 출력
		int nameBytes = is.read(datas); // 바가지로 읽는다.
		
		// 최종사용자가 키보드에서 여러 문자를 입력한 이후, 마지막으로 엔터키를 치면
		// read() 메소드가 읽는다. 읽은 베이트 배열에 있는 키코드 값을 가지고
		// String 클래스의 생성자를 이용해서, 문자열로 다시 디코딩 수행
		
		String name = new String( datas, 0, nameBytes - 2 ); // 디코딩 수행 (****)
		// nameBytes에 -2를 하는 이유 (***) :
		// 우리가 키보드를 작성하고 엔터를 치게 되는데 .read( )메소드가 엔터도 값으로 입력받아버리기 때문이다.
		// 이때 엔터의 키코드 크기가 2이고, 마지막에 들어가기 때문에 -2를 하지 않으면 작성한 이름에 엔터도 합쳐져서 출력이 된다.
		// 그렇기에 -2를 꼭 작성해야 한다!!! (***)
		
//		==========================================================
		
		System.out.print("하고 싶은 말 : "); // prompt 메세지 출력
		int commentBytes = is.read(datas); // 바가지로 읽는다.
		// 한글은 2바이트여서 1바이트씩 읽으면 깨지기 때문에, 바가지로 읽고 문자열로 디코딩해야 한다!! (**)
		
		String comment = new String( datas, 0, commentBytes - 2 ); // 디코딩 수행 (****)
		
//		==========================================================
		
		System.out.println("입력한 이름 : " + name);
		System.out.println("입력한 하고 싶은 말 : " + comment);
		
//		==========================================================
		
		// 출력 :
//		이름 : 홍길동
//		하고 싶은 말 : 언제 잡히냐?
//		입력한 이름 : 홍길동
//		입력한 하고 싶은 말 : 언제 잡히냐?
		
	} // main

} // end class

더보기

13. System.out

package syserr;

import java.io.OutputStream;

public class SystemOutExample {
	
	public static void main (String[]  args) throws Exception { 
		
		OutputStream os = System.out; // 다형성 1 : PrintStream ----> OutputStream
		
		for ( byte b = 48; b < 58; b++) { // 아스키 코드 : 0-9까지에 해당 (***)
			
			os.write(b);
			// 출력 : 0123456789
			
		} // for
		
		os.write(10);	// LF : Line Feed(10)	CR : Carring Return(13)
		// 아스키 코드의 10과 13은 엔터키에 해당되어서 줄바꿈이 된것이지 그 외의 아무것도 출력되지 않는다.
		
		os.flush();
		
		// 출력 : 0123456789 + 엔터키 ( 줄바꿈 )
		
//		os.close();를 해야 할 것 같은데, 왜 하지 않았을까? : (****)
//		운영체제가 주는 표준 입출력은 절대!!! 닫으면 안된다!!
//		닫으면 콘솔과의 연결이 완전 끊어져 버린다.
		
//		===================================================
		
		for ( byte b = 97; b < 123; b++) { // 소문자
			os.write(b);
		} // for
		
		os.write(10);
		
		// 출력 : abcdefghijklmnopqrstuvwxyz
		
//		===================================================
		
		String hangul = "가나다라마바사아자차카타파하";
		byte [] hangulBytes = hangul.getBytes("UTF-8");
		// "UTF-8"를 getBytes( )안에 작성하지 않으면 운영체제 기반으로 언어를 받아들이게 된다.
		// 만약 String hangul에 사용한 문자집합과 getBytes( )안에 넣은 문자집합이 서로 다르면 문자가 개져서 나온다.
		
		os.write(hangulBytes);
		
		os.flush();
		// 출력 : 가나다라마바사아자차카타파하
		
//		===================================================
		
	} //main

} // end class
728x90
댓글
«   2024/09   »
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
최근에 올라온 글
Total
Today
Yesterday
공지사항