2023.06.04 - [국비 지원/JAVA] - [JAVA] 바이트 기반 입출력 스트림(Stream) (1)
앞에 글에서는 바이트 기반 입출력 스트림인 InputStream과 OutputStream에 대해서 알아보았다.
이번 글에서는 문자 기반 입출력 스트림인 Reader와 Writer에 대해서 정리해보도록 하자.
문자 출력 스트림 : Writer
리턴 타입 | 메소드 | 설명 |
void | write(int c) | 매개값으로 주어진 한 문자를 보낸다. |
void | write(char[] cbuf) | 매개값으로 주어진 배열의 모든 문자를 보낸다. |
void | write(char[] cbuf, int off, int len) | 매개값으로 주어진 배열에서 cbuf[off]부터 len개까지의 문자를 보낸다. |
void | write(String str) | 매개값으로 주어진 문자열을 보낸다. |
void | write(String str, int off, int len) | 매개값으로 주어진 문자열에서 off 순번부터 len개까지의 문자를 보낸다. |
void | flush() | 버퍼에 잔류하는 모든 문자를 출력한다. |
void | close() | 출력 스트림을 닫는다. |
1) write(int c) 메소드 : 한 문자씩 출력하기
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class WriterStreamEx {
public static void main(String[] args) throws Exception {
Writer writer = new FileWriter("C:/Temp/writeTest4.txt");
char a = 'A';
char b = 'B';
char c = 'C';
writer.write(a);
writer.write(b);
writer.write(c);
writer.flush();
writer.close();
}
}
코드를 실행하면 아래와 같이 txt 파일이 생성된 것을 확인할 수 있다.
2) writer)char[] cbuf) : 배열 전체 출력하기
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class WriterStreamEx {
public static void main(String[] args) throws Exception {
Writer writer = new FileWriter("C:/Temp/writeTest5.txt");
char[] arr = {'A', 'B', 'C'};
writer.write(arr);
writer.flush();
writer.close();
}
}
마찬가지로 txt 파일이 생성된 것을 확인할 수 있다.
3) write(char[] cbuf, int off, int len) 메소드 : 배열 일부 출력하기
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class WriterStreamEx {
public static void main(String[] args) throws Exception {
Writer writer = new FileWriter("C:/Temp/writeTest6.txt");
char[] arr = {'A', 'B', 'C', 'D', 'E'};
writer.write(arr, 1, 3);
writer.flush();
writer.close();
}
}
배열의 첫 번째 인덱스부터 3개를 출력하므로 'B', 'C', 'D'가 파일로 저장되었다.
4) write(String str)와 write(String str, int off, int len) 메소드 : 문자열 출력하기
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class WriterStreamEx {
public static void main(String[] args) throws Exception {
Writer writer = new FileWriter("C:/Temp/writeTest7.txt");
String str = "Hello";
writer.write(str);
writer.flush();
writer.close();
}
}
문자열 입력 스트림 : Reader
리턴 타입 | 메소드 | 설명 |
int | read() | 1개의 문자를 읽고 리턴한다. |
int | read(char[] cbuf) | 읽은 문자들을 매개값으로 주어진 문자 배열에 저장하고 읽은 문자 수를 리턴한다. |
int | read(char cbuf, int off, int len) | len개의 문자를 읽고 매개값으로 주어진 문자 배열에서 cbuf[off]부터 len개까지 저장한다. 그리고 읽은 문자를 수를 리턴한다. |
void | close() | 입력 스트림을 닫는다. |
1) read() 메소드 : 한 문자씩 읽기
import java.io.FileReader;
import java.io.Reader;
public class WriterStreamEx {
public static void main(String[] args) throws Exception {
Reader reader = new FileReader("C:/Temp/writeTest4.txt");
while(true) {
int result = reader.read();
if(result == -1) { // 파일 끝에 도달했을 경우
break;
}else {
System.out.println((char)result);
}
}
reader.close();
}
}
read() 메소드가 리턴한 int 값을 char 타입으로 변환한다면 아래와 같이 읽은 문자를 얻을 수 있다.
2) read(char[] cbuf) 메소드 : 배열 길이만큼 읽기
import java.io.FileReader;
import java.io.Reader;
public class WriterStreamEx {
public static void main(String[] args) throws Exception {
Reader reader = new FileReader("C:/Temp/writeTest5.txt");
char[] arr = new char[100];
while(true) {
int size = reader.read(arr); // 배열 길이만큼 읽기
if(size == -1) {
break;
}else {
for(int i=0; i<size; i++) {
System.out.println(arr[i]);
}
}
}
reader.close();
}
}
많은 양의 문자를 읽을 때는 read() 메소드보다 read(char[] cbuf) 메소드를 사용하는 것이 좋다.
read(char[] cbuf)를 사용한다면 반복해서 읽을 필요없이 한 번에 배열의 길이만큼 읽을 수 있기 때문이다.
3) read(char[] cbuf, int off, int len) 메소드 : 지정한 길이만큼 읽기
import java.io.FileReader;
import java.io.Reader;
public class WriterStreamEx {
public static void main(String[] args) throws Exception {
Reader reader = new FileReader("C:/Temp/writeTest6.txt");
char[] arr = new char[5];
int size = reader.read(arr, 2, 3);
if(size != -1) { // 읽은 문자가 있다면
for(int i=0; i<arr.length; i++) {
System.out.println(arr[i]);
}
}
reader.close();
}
}
위에서 저장된 B, C, D 입력 스트림으로부터 3개의 문자를 읽고
길이 5인 배열의 arr[2], arr[3], arr[4]에 각각 저장된 것을 아래의 사진을 통해 볼 수 있다.
'국비 지원 > JAVA' 카테고리의 다른 글
[JAVA] 보조 스트림 (1) (0) | 2023.06.09 |
---|---|
[JAVA] 바이트 기반 입출력 스트림 (1) (0) | 2023.06.04 |
[JAVA] ArrayList와 제네릭(Generic) (0) | 2023.05.28 |
[JAVA] 예외 처리 (0) | 2023.05.21 |
[JAVA] final과 상수(static final) (0) | 2023.05.21 |