안녕하세요, 코린이의 코딩 학습기 채니 입니다.
개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.
자바 입출력(java IO)
- 프로그램을 기준으로 외부로부터 데이터가 들어오는 입력(input)과 프로그램에서 외부로 나가는 출력(output)으로 구성
- 입력의 대상 : 키보드/마우스/파일/네트워크 등
- 출력의 대상 : 화면/프린터/파일/네트워크/콘솔 등
자바 입출력 종류
① byte 단위 입출력
- 송수신하고자 하는 데이터를 byte 단위로 쪼개 보내고 받는 것
② char 단위 입출력
- 텍스트 전송에 특화된 방법
Reader 클래스의 자식 클래스에는 FileReader, BufferedReader, InputStreamReader가 있고,
Writer 클래스의 자식 클래스에는 FileWriter, BufferedWriter, OutputStreamWriter, printWriter가 있습니다.
InputStreamReader와 OutputStreamReader 클래스는 byte 단위의 데이터 입출력 클래스인 InputStream과 OutputStream을 char 단위의 입출력 클래스인 Reader와 Writer로 변환하는 클래스입니다.
Reader의 주요 메소드
int skip(long n) | n개의 char 스킵하기(실제 스킵된 char 개수를 리턴) |
int read() | int(4byte)의 하위 2byte에 읽은 데이터를 저장해 리턴 |
int read(char[] cbuf) | 읽은 데이터를 char[] cbuf에 저장하고, 읽은 char개수를 리턴 |
abstract int read(char[] cbuf, int off, int len) | len 개수만큼 읽은 데이터를 char[] cbuf의 off 위치부터 저장 (추상 메소드) |
abstract void close() | Reader의 자원 반환 |
Writer의 주요 메소드
abstract void flush() | 메모리 버퍼에 저장된 데이터 내보내기(실제 출력 수행) (추상 메소드) |
void write(int c) | int(4byte)의 하위 2byte를 메모리 버퍼에 출력 |
void write(char[] cbuf) | 매개변수로 넘겨진 char[] cbuf 데이터를 메모리 버퍼에 출력 |
void write(String str) | 매개변수로 넘겨진 String 값을 메모리 버퍼에 출력 |
void write(String str, int off, int len) | str의 off 위치에서부터 len 개수를 읽어 메모리 버퍼에 출력 |
abstract void write(char[] cbuf, int off, int len) | char[]의 off 위치에서부터 len 개수를 읽어 출력(추상 메소드) |
abstract void close() | Writer의 자원 반환(추상 메소드) |
BufferedReader/BufferedWriter
- 메모리 버퍼를 사용하여 속도를 향상
//객체 생성 방법 BufferedReader (Reader)
File file1 = new File("files/test.txt");
BufferedReader br = new BufferedReader(new FileReader(file1));
//객체 생성 방법 BufferedWriter (Writer)
File file2 = new File("files/test.txt");
BufferedWriter bw = new BufferedWriter(new FileWriter(file2));
객체 생성 방식은 각 2가지가 있습니다.
BufferedReader | |
BufferedReader(Reader in) | 기본값 버퍼 크기 사용 |
BufferedReader(Reader in, int size) | 버퍼의 크기를 직접 지정 가능 |
BufferedWriter | |
BufferedWriter(Writer out) | 기본값 버퍼 크기 사용 |
BufferedWriter(Writer out, int size) | 버퍼의 크기를 직접 지정 가능 |
파일 읽고/쓰기
//1. 스트림 선언
BufferedReader br = null;
BufferedWriter bw = null;
File src = new File("files/test.txt");
File dest = new File("files/copycopy.txt");
try {
//2. 스트림 객체 생성
br = new BufferedReader(new FileReader(src));
bw = new BufferedWriter(new FileWriter(dest));
//3. 데이터 읽기/쓰기
String data = null;
//readLine():String 더이상 읽어올 내용이 없다면 null 반환
while((data = br.readLine()) != null) {
System.out.println(data); //개행 단위로 읽어와서 개행문자를 버리고 반환
bw.write(data);
bw.newLine(); //readLine 반환값에는 개행문자가 없으므로 추가
bw.flush();
}
} catch(IOException e) {
e.printStackTrace();
} finally {
//4. 자원반납
try {
br.close();
} catch(IOException e) {
e.printStackTrace();
}
try {
bw.close();
} catch(IOException e) {
e.printStackTrace();
}
}
@콘솔출력값
안녕하세요
Hello
합니당
//copycopy.txt
안녕하세요
Hello
합니당
☞ try-with-resource절
- with절에 선언된 Stream객체를 자동으로 반환 처리
- with절에 선언과 객체 할당을 모두 처리
- 여러 객체를 ; (세미콜론)으로 구분
File src = new File("files/test.txt");
File dest = new File("files/trywithresource.txt");
//1. 스트림 선언 및 객체 생성
try(
BufferedReader br = new BufferedReader(new FileReader(src));
BufferedWriter bw = new BufferedWriter(new FileWriter(dest));
) {
String data = null;
//2. 데이터 읽기/쓰기
while((data = br.readLine()) != null) {
System.out.println(data);
bw.write(data);
bw.newLine();
bw.flush();
}
} catch(IOException e) {
e.printStackTrace();
}
//filewithresource.txt
안녕하세요
Hello
합니당
with절 (~)에 선언된 Stream 객체는 자동으로 반환처리가 되므로 finally에 작성하였던 close()메소드를 이용한 자원 반납 코드는 없어도 됩니다.
조금은 더 간단해졌네요!
'Java > Java' 카테고리의 다른 글
컬렉션) 컬렉션 프레임 워크란? 배열의 단점, 컬렉션 사용 이유 (0) | 2022.03.30 |
---|---|
자바입출력/byte기반) 객체를 대상으로한 입출력 (ObjectInputStream, ObjectOutputStream) (0) | 2022.03.29 |
자바입출력/char기반) 파일을 대상으로한 입출력 (FileReader, FileWriter) (0) | 2022.03.29 |
자바입출력/byte기반) 버퍼입출력스트림 (BufferedInputStream, BufferedOutputStream) (0) | 2022.03.29 |
자바입출력/byte기반) 파일을 대상으로한 입출력 (FileInputStream, FileOutputStream) (0) | 2022.03.29 |