[Java] FILE (3) 입출력(Reader/Writer) - Character Stream(문자열기반 스트림)
in Java on Java File I/O
문자열 기반 스트림, 문자열 보조 스트림과 FILE 입출력(Reader/Writer)에 대해 정리 (3)
1 문자 기반 스트림
문자데이터를 다루는 데 사용된다는 것을 제외하고는 바이트기반 스트림과 문자기반 스트림의 사용방법은 거의 같다.
1-1 Reader와 Writer
Reader와 Writer는 모든 문자기반의 스트림의 조상이며, Reader/Writer 메서드는 byte 배열이 아닌 char 배열을 사용한다.
문자 기반 스트림이 단순히 2byte로 스트림을 처리한다는 것만을 의미하지 않으며, Reader/Writer는 여러 종류 인코딩과 자바에서 사용하는 유니코드간의 변환을 자동으로 처리해준다.
1-1-1 Reader
Reader는 문자 기반 입력 스트림의 최상위 클래스(조상)로 추상 클래스입니다. 모든 문자 기반 입력 스트림은 이 클래스를 상속
정의 된 메서드 | 설명 |
---|---|
abstract void close() | - inputStream 을 닫음 - 스트림을 닫음으로써 사용하고 있던 자원을 반환 |
void mark(int readlimit) | - inputStream 에서 현재 위치 표시 |
int read() | - 입력소스로부터 하나의 문자를 읽어서 0~65535 범위의 정수값을 반환, 더 이상 읽어 올 데이터가 없으면 -1을 반환 |
int read(char[] c) | - 입력소스로부터 매개변수로 주어진 배열 c의 크기만큼 읽어서 배열 c에 저장, 읽어 온 데이터의 개수 또는 -1을 반환 |
abstract int read(char[] c, int off, int len) | - 입력소스로부터 최대 len개의 byte를 읽어서, char[] 배열 c의 지정된 위치(off)부터 저장하고 읽은 데이터 수 또는 -1 반환 |
boolean ready() | 입력소스로부터 데이터를 읽을 준비가 되어 있는 알려줌 |
void reset() | - mark() 마지막으로 호출한 위치로 이동 |
long skip(long n) | - 현재위치에서 문자 수(n) 만큼 스킵 |
1-1-2 Writer
Writer는 문자 기반 출력 스트림의 최상위 클래스로 추상클래스(조상)입니다. 모든 문자 기반 출력 스트림 클래스는 이 클래스를 상속
정의 된 메서드 | 설명 |
---|---|
void close() | - OutputStream 을 닫음, 사용하고 있던 자원 반환 |
void flush() | - 스트림버퍼에 남은 모든 내용을 출력소스에 쓴다. |
void write(int i) | - 주어진 값을 출력소스에 쓴다. |
void write(char[] c) | - 주어진 char[] 배열의 모든 내용을 출력소스에 쓴다. |
void write(char[] c, int off, int len) | - 주어진 char c에 저장된 내용 중에서 off번째부터 len개 만큼만을 읽어서 출력소스에 쓴다. |
2 FileReader와 FileWriter
FileReader/FileWriter 파일로부터 텍스트 데이터를 읽고 쓰는데 사용하머, FileInputStream/FileOutputStream 사용방법은 비슷하다.
2-1 FileReader 와 FileInputStream 비교 설명
import java.io.*;
class FileReaderEx1 {
public static void main(String args[]) {
try {
String fileName = "test.txt";
FileInputStream fis = new FileInputStream(fileName);
FileReader fr = new FileReader(fileName);
int data =0;
// FileInputStream을 이용해서 파일내용을 읽어 화면에 출력한
// 1 byte 출력 -> 한글깨짐
while((data=fis.read())!=-1) {
System.out.print((char)data);
}
System.out.println();
fis.close();
// FileReader를 이용해서 파일내용을 읽어 화면에 출력한
// 2 byte 출력
while((data=fr.read())!=-1) {
System.out.print((char)data);
}
System.out.println();
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
실행결과
//test.txt 내용 : Hello. 문자열 스트림 안녕~
Hello. 문ìì´ ì¤í¸ë¦¼ ìë
~
Hello. 문자열 스트림 안녕~
◼︎ FileInputStream과 FileOutputStream을 사용한 파일 복사하는 예제
import java.io.*;
class FileCopy {
public static void main(String args[]) {
try {
FileReader fr = new FileReader(args[0]);
FileWriter fw = new FileWriter(args[1]);
int data =0;
while((data=fr.read())!=-1) {
fr.write(data); // void write(int b)
}
fr.close();
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2 문자기반 보조 스트림
2-1 BuffredReader와 BufferedWriter
BuffredReader와 BufferedWriter는 버퍼를 이용해서 입출력의 효율을 높일 수 있도록 해주는 역할을 한다.
- BuffredReader의 readLine()는 데이터를 라인단위로 읽어올 수 있는 메서드
- BufferedWriter의 newLine()는 줄바꿈 해주는 메서드
◼︎ FileReader와 BufferedReader를 사용해 파일 읽는 예제
import java.io.*;
class BufferedReaderEx1 {
public static void main(String[] args) {
try {
FileReader fr = new FileReader("test2.txt");
BufferedReader br = new BufferedReader(fr);
String line = "";
//while((data=fr.read())!=-1) 과 동일하다
//br.readLine() 을 통해 line 변수에 데이터를 넣고 null 아니면 for문 실핼
for (int i=1; (line = br.readLine()) != null; i++) {
System.out.println(line);
}
br.close();
} catch(IOException e) {}
}
}
실행결과
Hello. 문자열 스트림
TEST2
BuffredReader와 BufferedWriter 예제
출력끝
2-2 InputStreamReader와 OutputStreamWriter
바이트 기반 스트림을 문자 기반 스트림으로 연결시켜주는 역할을 한다. 그리고 바이트기반 스트림의 데이터를 지정된 인코드의 문자 데이터로 변환하는 작업을 수행한다.
2-2-1 InputStreamReader
생성자 / 메섣드 | 설명 |
---|---|
inputStreamReader(InputStream in) | OS의 기본 인코딩의 문자로 변환하는 inputStreamReader 생성 |
inputStreamReader(InputStream in, String ecoding) | 지정 된 인코딩으로 inputStreamReader 생성 |
String getEncoding() | inputStreamReader의 인코딩을 알려준다. |
2-2-2 OutputStreamWriter
생성자 / 메섣드 | 설명 |
---|---|
OutputStreamWriter(OutputStream in) | OS의 기본 인코딩의 문자로 변환하는 OutputStreamWriter 생성 |
OutputStreamWriter(OutputStream in, String ecoding) | 지정 된 인코딩으로 OutputStreamWriter 생성 |
String getEncoding() | OutputStreamWriter의 인코딩을 알려준다. |
◼︎ InputStreamReader와 BufferedReader를 이용한 출력 예제
import java.io.*;
class InputStreamReaderEx {
public static void main(String[] args) {
try {
//System.in은 InputStream의 객체
InputStream in = System.in;
//int byte = System.in.read();
InputStreamReader isr = new InputStreamReader(in);
BufferedReader br = new BufferedReader(isr);
System.out.println("사용중인 OS의 인코딩 :" + isr.getEncoding());
String line = "";
do {
System.out.print("문장을 입력하세요. 마치시려면 q를 입력하세요. ");
line = br.readLine();
System.out.println("입력하신 문장 : "+line);
} while(!line.equalsIgnoreCase("q"));
System.out.println("프로그램을 종료합니다.");
} catch(IOException e) {}
}
}
실행결과
사용중인 OS의 인코딩 :UTF8
문장을 입력하세요. 마치시려면 q를 입력하세요. 안녕하세요 문장 입력
입력하신 문장 : 안녕하세요 문장 입력
문장을 입력하세요. 마치시려면 q를 입력하세요.
[참고]
- 자바의 정석 2판 - 문자 기반 스트림