티스토리 뷰

728x90
반응형

Input이란 메모리로 들어오는 데이터의 흐름을 이야기하고, Output은 메모리에서 빠져나가는 데이터를 이야기한다.

메모리는 데이터를 byte 단위로 처리하는데, 이 byte 알갱이의 흐름을 "Stream"이라 한다. 

오늘 게시물에서는 자바의 다양한 입출력에 대해 알아볼 예정이다.

 

입출력 스트림 6가지를 예제를 통해 알아보자 !

 


"1 byte 처리 스트림 InputStream"

System.in을 많이 봐왔었다. System.in은 키보드와 연결된 System 클래스의 InputStream 타입의 static final 상수이다.

InputStream은 입력받을 수 있는 객체로 1byte 단위 처리 스트림이다.

따라서, 영문자, 숫자, 특수문자만 처리 가능하고, 한글은 처리가 불가능하다.

예제 1

1. InputStream 타입의 kbd에 System.in의 참조값 담기

InputStream kbd = System.in;

 

 

 

2. kbd의 read() 메소드를 이용하여 입력한 코드값 읽어와서 출력하기

try {
	//입력한 키의 코드값 읽어오기
	int code = kbd.read();
	System.out.println(code);
	char ch = (char)code;
    System.out.println(ch);
}catch (IOException e) {
	e.printStackTrace();
}

 

코드값이 255 이상이면, ch의 값이 출력되지 않는다.

즉, 한글인 '가'를 입력하면 '가' 가 제대로 출력되지 않고 깨져서 이상한 문자가 출력된다.

 

 


전체 코드

MainClass01.java

package test.main;

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

public class MainClass01 {
	public static void main(String[] args) {
		//System.in은 InputStream 타입의 System 클래스의 static final 상수
		//키보드와 연결된 InputStream 타입의 참조값을 kbd라는 지역변수에 담기
		//따라서 Scanner 객체에 참조값을 전달한 것
		//InputStream은 입력받을 수 있는 객체로, 1byte단위 처리 스트림이다.
		//영문자, 숫자, 특수문자만 처리 가능
		//한글 처리 불가
		InputStream kbd = System.in;
		System.out.print("입력: ");
		try {
			//입력한 키의 코드값 읽어오기
			int code = kbd.read();
			System.out.println(code);
			char ch = (char)code;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("main 메소드가 종료 됩니다.");
	}

}

"1byte 처리 스트림 OutputStream"

 

예제2 

 

System 클래스의 out이라는 static 필드에는 콘솔창에 출력할 수 있는 PrintStream 객체의 참조값이 들어있다. 

따라서, 다음과 같은 코드를 작성할 수 있다.

 

 

1. System.in의 PrintStream 참조값을 지역변수 ps에 넣기 

PrintStream ps = System.out;

 

 

2. 학습을 위해서 PrintStream 객체를 부모 type OutputStream으로 받아보기 

OutputStream os = ps;

 

 

3. 코드 출력해보기. flush()까지 호출해야 출력이 된다.

try {
	//출력은 .flush() 까지 호출해야 출력이 된다. 
	os.write(97);
	os.write(98);
	os.write(99);
	//한글 '가' 의 unicode 값이 44032 인데 한글이 출력이 될까???
	//os.write(44032); OutputStream 은 한글 출력 불가
	os.flush();//방출하기 
} catch (IOException e) {
	e.printStackTrace();
}

전체 코드

MainClass04.java

package test.main;

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

public class MainClass04 {
	public static void main(String[] args) {
		//System 클래스의 out이라는 static 필드에는 콘솔창에 출력할 수 있는
		//PrintStream 객체의 참조값이 들어있다.
		PrintStream ps = System.out;
		//학습을 위해서 PrintStream 객체를 부모 type OutputStream으로 받아보기
		//OutputStream 도 1byte 처리 스트림이다.
		OutputStream os = ps;
		try {
			//출력은 .flush() 까지 호출해야 출력이 된다. 
			os.write(97);
			os.write(98);
			os.write(99);
			//한글 '가' 의 unicode 값이 44032 인데 한글이 출력이 될까???
	        //os.write(44032); OutputStream 은 한글 출력 불가
			os.flush();//방출하기 
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

"2 byte 처리 스트림 InputStreamReader"

 

예제 3

 

InputStreamReader은 2byte처리 스트림이다. InputStream 타입을 생성자의 인자로 전달받는다.

 

 

1. InputStreamReader 객체 생성하여 지역변수 isr에 참조값 넣기

InputStream is = System.in;
InputStreamReader isr = new InputStreamReader(is);

 

 

2. 한글의 코드값을 읽을 수 있는지 확인하기

try {
	System.out.print("입력:");
	//한글의 코드값도 읽어들일 수 있다.
	int code = isr.read();
	System.out.println("code: "+code);
	//코드값에 대응되는 문자 얻어내기 
	char ch = (char)code;
	System.out.println(ch);
}catch (IOException e) {
	e.printStackTrace();
}

 

전체 코드

MainClass02.java

package test.main;

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

public class MainClass02 {
	public static void main(String[] args) {
		//1byte 처리 스트림
		InputStream is = System.in;
		//2byte 처리 스트림 
		InputStreamReader isr = new InputStreamReader(is);
		try {
			System.out.print("입력:");
			//한글의 코드값도 읽어들일 수 있다.
			int code = isr.read();
			System.out.println("code: "+code);
			//코드값에 대응되는 문자 얻어내기 
			char ch = (char)code;
			System.out.println(ch);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 


"OutputStreamWriter"

 

예제 4

 

OutputStreamWriter는 OutputStream 타입을 생성자의 인자로 전달받는다.

 

1. OutputStreamWriter 객체 생성해서 지역변수 osw에 참조값 담기

OutputStream os=ps;
OutputStreamWriter osw = new OutputStreamWriter(os);

 

 

2. 문자열과 코드 출력 테스트해보기

try {
	osw.write(44032);
	osw.write("오잉?");
	osw.flush();
} catch (IOException e1) {
	e1.printStackTrace();
}

전체 코드

MainClass05.java

package test.main;

import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintStream;

public class MainClass05 {
   public static void main(String[] args) {
      //System 클래스의 out 이라는 static 필드에는 콘솔창에 출력할수 있는
      //PrintStream 객체의 참조값이 들어 있다.
      PrintStream ps=System.out;
      //학습을 위해서 PrintStream  객체를 부모 type OutputStream 으로 받아보기
      //OutputStream 도 1byte 처리 스트림이다.
      OutputStream os=ps;
      OutputStreamWriter osw = new OutputStreamWriter(os);
      try {
		osw.write(44032);
		osw.write("오잉?");
		osw.flush();
	} catch (IOException e1) {
		// TODO Auto-generated catch block
		e1.printStackTrace();
	}
   }
}

"버퍼를 이용하여 읽는 BufferedReader (문자열 처리가능)" 

 

예제 5

 

BufferedReader는 Scanner에 비해 상대적으로 빠르지만, 엔터만 경계로 인식한다. 

BufferedReader도 2 byte 처리 스트림이다. 

 

BufferedReader은 Reader 타입을 전달받는데, InputStreamReader은 Reader의 자식이므로, 자바의 다형성에 의해 InputStreamReader 타입도 넘겨줄 수 있다.

 

따라서, 다음과 같이 코드를 작성할 수 있다.

 

1.  BufferedReader 객체를 생성해서 지역 변수 br에 참조값 저장하기

InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);

 

 

2. 문자열 입력 받고 출력하기

try {
	System.out.println("문자열 한줄 입력:");
	//문자열 한줄 입력 받기
	String line = br.readLine();
	System.out.println("입력한 문자열: "+ line);
} catch (IOException e) {
	
	e.printStackTrace();
}

전체 코드

MainClass03.java

package test.main;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Scanner;

public class MainClass03 {
	public static void main(String[] args) {
		//1 byte 처리 스트림
		InputStream is = System.in;
		//2 btye 처리 스트림
		InputStreamReader isr = new InputStreamReader(is);
		BufferedReader br = new BufferedReader(isr);
		
		try {
			System.out.println("문자열 한줄 입력:");
			//문자열 한줄 입력 받기
			String line = br.readLine();
			System.out.println("입력한 문자열: "+ line);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		Scanner scan = new Scanner(System.in);
		String line = scan.nextLine();
		
	}
}

"BufferedWriter"

 

예제 6

 

1. BufferedWriter 객체 생성하여 BufferedWriter 타입의 지역변수 bw에 참조값 담기

 

BufferedWriter 생성자는 Writer타입을 전달받는다.

따라서, PrintStream 타입의 참조값을 OutputStream 타입에 전달하고, OutputStreamWriter 객체 생성 시 생성자의 인자로 전달하여 OutputStreamWriter 지역변수에 넣어준 후, OutputStreamWriter의 부모가 Writer이므로 이 참조값을 BufferedWriter 생성자의 인자로 전달할 수 있다. (이렇게 안해도되는데 앞에서 배운것을 응용하여 복잡하게 해보았다.)

코드로 확인하면 간단하다.

PrintStream ps=System.out;
//학습을 위해서 PrintStream  객체를 부모 type OutputStream 으로 받아보기
//OutputStream 도 1byte 처리 스트림이다.
OutputStream os=ps;
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);

 

 

2. 문자열 출력해보기 (write( ), newLine( ))

write( )와 newLine( ) 메소드로 출력할 수 있는데 newLine( )은 개행기호를 출력해주는 메소드가 내장되어있다.

 

try {
    bw.write("하나\n");
    bw.write("두울");
    bw.newLine();//개행기호를 출력해주는 메소드가 있다. 
    bw.write("세엣");
    bw.flush();
		
} catch (IOException e1) {
	e1.printStackTrace();
}

전체 코드

MainClass06.java

package test.main;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintStream;

public class MainClass06 {
   public static void main(String[] args) {
      //System 클래스의 out 이라는 static 필드에는 콘솔창에 출력할수 있는
      //PrintStream 객체의 참조값이 들어 있다.
      PrintStream ps=System.out;
      //학습을 위해서 PrintStream  객체를 부모 type OutputStream 으로 받아보기
      //OutputStream 도 1byte 처리 스트림이다.
      OutputStream os=ps;
      OutputStreamWriter osw = new OutputStreamWriter(os);
      BufferedWriter bw = new BufferedWriter(osw);
      
      try {
    	  bw.write("하나\n");
    	  bw.write("두울");
    	  bw.newLine();//개행기호를 출력해주는 메소드가 있다. 
    	  bw.write("세엣");
    	  bw.flush();
		
	} catch (IOException e1) {
		// TODO Auto-generated catch block
		e1.printStackTrace();
	}
   }
}

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함