티스토리 뷰
[Java] 입출력 InputOutPut #1 Stream 6가지/ InputStream, OutputStream, InputStreamReader, OutputStreamWriter, BufferedReader, BufferdWriter
Happyoon ~ 2021. 11. 10. 14:04Input이란 메모리로 들어오는 데이터의 흐름을 이야기하고, 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();
}
}
}
'development > Java' 카테고리의 다른 글
- Total
- Today
- Yesterday
- jsp
- Django
- 프로그래머스
- 정렬
- Oracle
- 브루트 포스
- html
- python
- 고득점 키트
- R
- brute force
- 장고
- 자바
- 파이썬
- jQuery
- baekjoon
- 백준
- Java
- append
- 덱
- javascript
- 자바스크립트
- web
- Case When
- 큐
- 문자열
- CSS
- 단계별로풀어보기
- bootstrap
- 스프링
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |