티스토리 뷰
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
'KH 정보교육원 [ Java ]' 카테고리의 다른 글
KH 27일차 - 보조스트림 / 네트워크 (0) | 2022.04.05 |
---|---|
KH 26일차 - Scanner / File 클래스 (0) | 2022.04.04 |
KH 24일차 - 자바 입출력 ( Reader / Writer ) (0) | 2022.03.31 |
KH 23일차 - 컬렉션 프레임워크 및 IO (0) | 2022.03.30 |
KH 22일차 - 컬렉션 프레임워크 (0) | 2022.03.29 |