반응형
01. java.io패키지 이용하기
- 입력과 출력 관련 클래스가 선언된 패키지
02. 스트림(Stream)이란?
- 값(데이터)을 전달하기 위한 목적으로 생성된 입력클래스 또는 입력클래스 객체
- 입력클래스 = 입력스트림 이라고 부름
- 입력클래스 = 출력스트림 이라고 부름
- 시냇물이 흐르는 모양을 모델링하여 만들어 값이 한쪽 방향으로만 전달되며 순차적으로 처리됨
03. 스트림(Stream)클래스의 종류
1. 원시데이타 기반 스트림(Byte Stream)
- 1Byte
- 가공되지 않은 원시데이타를 전달하기 위한 입출력 스트림
🐹 최상위 부모 클래스
- 추상클래스라 직접 객체못만들고 자식클래스로 객체 생성해 사용
- 입력스트림 : InputStream 클래스
- 출력스트림 : OutputStream 클래스
🐹 자식 클래스
- 입력스트림: 값을 1Byte 단위로 입력하기 위한 스트림
- XXXInputStream 클래스 ex) FileInputStream
- 출력스트림 : 값을 1Byte 단위로 출력하기 위한 스트림
- XXXOutputStream 클래스 ex) FileOutputStream
🐹 InputStream.read( )
- 입력스트림에 존재하는 값(1Byte)을 읽어 반환하는 메소드
- 순수한 데이타를 1Byte씩 그대로 읽어들임 - 가공x
- 반환값: int
- 입력스트림에 값이 없는 경우 : 스레드는 일시 중지 상태로 전환
- 입력스트림에 엔터(Enter)가 입력될 경우 : 스레드 다시 실행
- 🔥 입력스트림 관련 메소드는 IOException 발생!!!
- 🔥 일반예외이므로 예외처리 하지 않을 경우 에러 발생
🐹OutputStream.write(int b)
- 출력스트림에게 값(1Byte)을 전달하는 메소드
- 🔥 출력스트림 관련 메소드는 IOException 발생!!!
- 🔥 일반예외이므로 예외처리 하지 않을 경우 에러 발생
2. 문자데이타 기반 스트림(Character Stream)
- 2Byte
- 원시데이타를 가공처리한 문자데이타로 전달하기 위한 입출력 스트림
🐹 최상위 부모 클래스
- 추상클래스라 직접 객체못만들고 자식클래스로 객체 생성해 사용
- 입력스트림 : Reader 클래스
- 출력스트림 : Writer 클래스
🐹 자식 클래스
- 입력스트림: 값을 2Byte 단위(유니코드)로 입력하기 위한 스트림
- XXXReader클래스 ex) FileReader
- 출력스트림: 값을 2Byte 단위(유니코드)로 출력하기 위한 스트림
- XXXWriter클래스 ex) FileWriter
- 🔧 인코딩(en-coding)하다
- 원시데이타를 가공 처리하여 문자데이타로 변환하다
- 인코딩을 해서 원하는 문자형태 (캐릭터셋-CharSet)가 만들어진다
- ex) 한국어, 영어, ... 입출력
- ex. 한글의 인코딩 종류 => 완성형 : ms949 (윈도우의 기본값) / 조합형(자음모음분리) : utf-8
- ex. java.awt패키지를 이용할 때 한글쓰면 깨지는 이유 : 인코딩의 형태가 현재 이클립스(utf-8)로 설정되어있는데, awt가 제공해주는 인코딩 형태와 다르기 때문!
🐹Reader.read( )
- 입력스트림에 존재하는 값(2Byte)을 읽어 반환하는 메소드
- 반환값 : int
- 입력스트림에 값이 없는 경우 : 스레드는 일시 중지 상태로 전환
- 입력스트림에 엔터(Enter)가 입력될 경우 : 스레드 다시 실행
- 🔥 입력스트림 관련 메소드는 IOException 발생!!!
- 🔥일반예외이므로 예외처리 하지 않을 경우 에러 발생
🐹Writer.write()
- 출력스트림에게 값(2Byte)을 전달하는 메소드
- Writer는 값을 보낼 때 하나씩 안보내고, 대량으로 보내려는 성질이 있음
- 출력버퍼(= 임시메모리) : 문자데이타는 출력 버퍼에 일정 크기만큼 저장하고, 일정크기가 지나면 한번에 출력스트림으로 전송
- 🔥 출력스트림 관련 메소드는 IOException 발생!!!
- 🔥일반예외이므로 예외처리 하지 않을 경우 에러 발생
🐹Writer.flush()
- 출력버퍼에 저장된 문자데이터를 출력스트림으로 모두 전달하는 메소드
- 즉, "버퍼에 있는 거 쌓아두지 말고 있는 그대로 출력스트림에 다 보내세요~"
04. 입출력 스트림 예시
1. ByteStreamApp 원시데이타 (키보드로 입력 받아 모니터에 출력)
io > ByteStreamApp.java
//입력스트림 : 원시데이타 기반 스트림 - System.in스트림
//출력스트림 : 원시데이타 기반 스트림 - System.out스트림
package xyz.itwill.io;
import java.io.IOException;
//키보드로 원시데이타를 입력받아 모니터에 전달하여 출력하는 프로그램
// => EOF(End Of File : 입력종료 - Ctrl+Z) 신호를 입력하면 프로그램 종료
//=> 콘솔에서 사용하는 입력종료단축키 Ctrl+Z(윈도우쉘) - window / mac에서는 좀비상태가 됨ㅠ 누르지말자!
//=> 콘솔에서 사용하는 입력종료단축키 Ctrl+D(유닉스쉘) - mac
...
//=> 콘솔에서 사용하는 입력취소단축키 Ctrl+C(윈도우쉘) - window
public class ByteStreamApp {
public static void main(String[] args) throws IOException {
System.out.println("[메세지]키보드를 눌러 값을 입력해 주세요.[프로그램 종료 : Ctrl+Z]");
//키보드 입력값을 저장하기 위한 변수
int readByte;
while(true) {
//System.in입력스트림 : Java 프로그램 개발을 위해 기본적으로 제공되는 키보드 입력스트림
// => 따로 객체만들필요 없음 (static in)
// => InputStream 클래스를 기반으로 제공되는 입력스트림(객체)
// => 키보드를 누르면 이벤트가 발생된 키보드의 값을 입력스트림으로 전달
//입력스트림 관련 메소드는 IOException 발생(일반 예외- 예외처리필수)
//키보드입력스트림은 예외발생 가능성이 낮으므로 메인메소드를 호출하는 JVM에게 떠넘겨서 알아서 예외처리하도록 예외전달하기
//키보드가 고장나지 않는 이상 입력예외 발생 거의없음
readByte=System.in.read();
//입력종료신호(Ctrl+Z : EOF)가 전달된 경우 반복문 종료
if(readByte==-1) break;
//System.out출력스트림 : Java 프로그램 개발을 위해 기본적으로 제공되는 모니터 출력스트림
// => 따로 객체만들필요 없음 (static out)
// => OutputStream 클래스(PrintStream 클래스)를 기반으로 제공되는 출력스트림(객체)
// => 출력스트림에 값을 전달하면 모니터에 출력
//=> (일종의 상속 개념) OutputStream 상속 -> PrintStream 상속 -> System.in 스트림
//=> 자식객체인 PrintStream 클래스도 사용가능하니 더 많은 메소드 호출 가능
//출력스트림 관련 메소드는 IOException 발생(일반 예외- 예외처리필수)
//모니터출력스트림은 예외발생 가능성이 낮으므로 메인메소드를 호출하는 JVM에게 떠넘겨서 알아서 예외처리하도록 예외전달하기
//모니터가 고장나지 않는 이상 출력예외 발생 거의없음
System.out.write(readByte);
}
System.out.println("[메세지]프로그램을 종료합니다.");
}
}
// 1Byte 전달(입력) -> 1Byte 출력 -> 1Byte 전달(입력) -> 1Byte 출력 -> 1Byte 전달(입력) -> 1Byte 출력 ..
//=> 한글 출력 가능 : 1Byte씩 전달해 출력하기 때문
2. CharcterStreamApp 문자데이타 (키보드로 입력 받아 모니터에 출력)
io > CharcterStreamApp.java
//입력스트림 : 문자데이타 기반 스트림 - InputStreamReader 스트림 >> System.in객체 전달받아 원시데이타 가공처리
//출력스트림 : 문자데이타 기반 스트림 - PrintWriter스트림 >> System.out객체 전달받아 원시데이타 가공처리
package xyz.itwill.io;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
//키보드로 문자데이타를 입력받아 모니터에 전달하여 출력하는 프로그램
//=> EOF(End Of File : 입력종료 - window - Ctrl+Z) 신호를 입력하면 프로그램 종료 /mac - Ctrl+D
public class CharcterStreamApp {
public static void main(String[] args) throws IOException {
System.out.println("[메세지]키보드를 눌러 값을 입력해 주세요.[프로그램 종료 : Ctrl+Z]");
//InputStreamReader입력스트림 : InputStream 객체를 전달받아 문자데이타를 입력받기 위한 스트림(Reader 객체)을 생성하기 위한 클래스
// => 특징) 1. 독립적으로 객체 못만듦 2. 반드시 inputStream클래스(1Byte) 전달받아서 객체 만들 수 있음
// => 즉, 원시데이터를 전달받아서 가공처리해 1Byte에서 2Byte로 읽어들일 수 있게 됨
InputStreamReader in = new InputStreamReader(System.in);
//OutputStreamWriter출력스트림 : OutputStream 객체를 전달받아 문자데이타를 전달하기 위한 스트림(Writer 객체)을 생성하기 위한 클래스
//방법1.
//OutputStreamWriter out = new OutputStreamWriter(System.out);
//PrintWriter출력스트림 : OutputStream 객체를 전달받아 문자데이타를 전달하기 위한 스트림(Writer 객체)을 생성하기 위한 클래스
// => OutputStreamWriter 클래스보다 많은 메소드를 제공하는 클래스
// => 왜? OutputStreamWriter의 자식이라 PrintWriter가 훨씬 메소드가 많음 - 효율적
//방법2.
PrintWriter out = new PrintWriter(System.out);
//키보드 입력값을 저장하기 위한 변수
int readByte;
while(true) {
readByte = in.read();
if(readByte == -1) break;
//Writer.write() : 출력스트림에게 값(2Byte)을 전달하는 메소드
// => 문자데이타는 출력버퍼에 일일정 크기만큼 저장하고 한번에 출력스트림으로 전송하여 처리
out.write(readByte);
//Writer.flush() : 출력버퍼에 저장된 문자데이타를 출력스트림으로 모두 전달하는 메소드
out.flush();
}
System.out.println("[메세지] 프로그램을 종료합니다.");
}
}
3. CUI프로그램 (키보드로 이름과 태어난 년도를 입력 받아 이름과 나이를 계산하여 출력)
io > ConsoleIOApp.java
- CUI프로그램 (콘솔프로그램) : ⌨️키보드로(입력)받아 🖥모니터에(출력)하는 프로그램
- GUI프로그램 : ⌨️키보드 입력 시 발생하는 것 : 키보드이벤트
- 즉, GUI프로그램에서는 System.in(키보드) & System.out(모니터)을 사용하지 않음
//🔥 스트림의 다단계 연결 = 스트림확장
// => 입력과 출력 관련 보조 클래스로 스트림의 다단계 연결을 이용해 스트림을 확장해서 사용한다.
// => 확장함으로서 더 많은 메소드를 사용할 수 있다!
//1
//(⌨️) 입력스트림 : 확장해 사용할 예정 - "키보드로 이름과 태어난 년도를 (입력)받아,"
//키보드입력스트림의 확장
//Sytem.in객체 (입력객체)
// => 원시데이타 전달(1Byte씩만) : ㅎ / ㅗ / ㅇ / ...
//InputStreamReader 객체의 입력스트림으로 확장 - new InputStreamReader(System.in)
// => 문자 데이타 전달(2Byte씩만) : '홍' / '길' / '동'
//BufferedReader 객체의 입력스트림으로 확장 - new BufferedReader(new InputStreamReader(System.in))
// => 대량의 문자 데이타 전달 가능해짐!(only 문자열로 - 4Byte) : "홍길동"
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
//2.
//🔔) 계산 : 입력받은 값을 이용한 계산코드 작성 - "이름과 나이를 계산하여,"
//3.
//(🖥) 출력스트림 : 확장 안하고 사용할 예정 - "모니터에(출력)하는 프로그램"
//모니터출력스트림 - 확장필요없음
//System.out객체 (출력객체)
// => Java에서 기본적으로 제공되는 모니터 출력 스트림은 PrintStream객체로 생성되었기 때문에,
// => print() 또는 println() 메소드로 값을 문자열로 변환하여 출력이 가능하여 확장할 필요없음
System.out.print("이름 입력 >> ");
System.out.print("태어난 년도 입력 >> ");
System.out.println("[결과]"+name+"님의 나이는 "+age+"살 입니다.");
package xyz.itwill.io;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Calendar;
//키보드로 이름과 태어난 년도를 입력받아 이름과 나이를 계산하여 출력하는 프로그램
public class ConsoleIOApp {
public static void main(String[] args) throws IOException {
//🔥🔥🔥
//Java에서 기본적으로 제공되는 키보드 입력스트림(System.in)을 InputStreamReader 객체의 입력스트림으로 확장하여 문자데이타를 입력받을 수 있도록 설정하고 BufferedReader 객체의 입력스트림으로 확장하여 대량의 문자데이타를 입력 받을 수 있도록 설정
// => 입출력 관련 보조 클래스로 스트림의 다단계 연결을 이용하여 스트림 확장 가능
// => 키보드로 문자열을 입력받기 위한 기능을 제공받기 위한 입력스트림 생성
// => 하나의 BufferedReader 입력스트림을 만듦으로서, 앞으로 키보드로부터 받은 값들을 대량의 문자 데이타(문자열)로 전달할 것이다!!!
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
//🔥🔥🔥
//Java에서 기본적으로 제공되는 모니터 출력스트림(System.out)은 PrintStream 객체로 생성되어 print() 또는 println() 메소드로 값을 문자열로 변환하여 출력 가능
// => 모니터에 출력하는 System.out객체를 사용할 것이라 따로 객체를 만들 필요없고, 이미 사용할 메소드를 가지고 있기 때문에 확장할 필요도 없다!
System.out.print("이름 입력 >> ");
//BufferedReader.readLine() : 입력스트림에서 문자열을 얻어와 반환하는 메소드
String name=in.readLine();
System.out.print("태어난 년도 입력 >> ");
//키보드로 입력받은 문자열을 정수값으로 변환하여 저장 - NumberFormatException 발생 가능
int birthYear=Integer.parseInt(in.readLine()); //scanner는 오류 많아 원래 잘 사용안함
int age=Calendar.getInstance().get(Calendar.YEAR)-birthYear+1;
System.out.println("[결과]"+name+"님의 나이는 "+age+"살입니다.");
}
}
반응형
'java > java.io' 카테고리의 다른 글
[java.io] 5. ✏️텍스트 파일 편집기 프로그램 - 메모장 (0) | 2024.07.01 |
---|---|
[java.io] 4. 객체 직렬화(Object Serialization) 클래스 (1) | 2024.07.01 |
[java.io] 3. Data보조스트림 | Object보조스트림 (1) | 2024.06.30 |
[java.io] 2. File(파일)클래스 (0) | 2024.06.30 |