[Java] 입출력 I/O - 문자기반의 보조스트림
BufferedReader와 BufferedWriter
BufferedReader와 BufferedWriter는 버퍼를 이용해서 입출력의 효율을 높일 수 있도록 해주는 역할을 한다. 버퍼를 이용하면 입출력의 효율이 비교할 수 없을 정도로 좋아지기 때문에 사용하는 것이 좋다.
BufferedReader의 readLine()을 사용하면 데이터를 라인단위로 읽을 수 있고 BufferedWriter는 newLine()이라는 줄바꿈해주는 메서드를 가지고 있다.
import java.io.*;
class BufferedReaderEx1 {
public static void main(String args[]) {
try {
FileReader fr = new FileReader("BufferedReaderEx1.java");
BufferedReader br = new BufferedReader(fr);
String line = "";
for(int i=1; (ilne = br.readLine())!=null; i++) {
// ";"를 포함한 라인을 출력한다.
if(line.indexOf(";")!=-1)
System.out.println(i + " : " + line);
}
br.close();
} catch(IOException e) {}
}
}
BufferedReader의 readLine()을 이용해서 파일을 라인단위로 읽은 다음 indexOf()를 이용해서 ';' 를 포함하고 있는지 확인하여 출력하는 예제이다. 파일에서 특정 문자 또는 문자열을 포함하는 라인을 쉽게 찾아낼 수 있음을 보여준다.
InputStreamReader와 OutputStreamWriter
InputStreamReader와 OutputStreamWriter는 이름에서 알 수 있는 것과 같이 바이트 기반 스트림을 문자기반 스트림으로 연결시켜주는 역할을 한다. 그리고 바이트기반 스트림의 데이터를 지정된 인코딩의 문자데이터로 변환하는 작업을 수행한다.
|참고| InputStreamReader와 OutputStreamWriter는 Reader와 Writer의 자손이다.
생성자 / 메서드 | 설명 |
InputStreamReader(InputStream in) | OS에서 사용하는 기본 인코딩의 문자로 변환하는 InputStreamReader를 생성한다. |
InputStreamReader(InputStream in, String encoding) | 지정된 인코딩을 사용하는 InputStreamReader를 생성한다. |
String getEncoding() | InputStreamReader의 인코딩을 알려준다. |
생성자 / 메서드 | 설명 |
OutputStreamWriter(OutputStream out) | OS에서 사용하는 기본 인코딩의 문자로 변환하는 OutputStreamWriter를 생성한다. |
OutputStreamWriter(OutputStream out, String encoding) | 지정된 인코딩을 사용하는 OutputStreamWriter를 생성한다. |
String getEncoding() | OutputStreamWriter의 인코딩을 알려준다. |
한글 윈도우에서 중국어로 작성된 파일을 읽을 때 InputStreamReader(InputStream in, String encoding)를 이용해서 인코딩이 중국어로 되어 있다는 것을 지정해주어야 파일의 내용이 깨지지 않고 올바르게 보일 것이다. 인코딩을 지정해 주지 않는다면 OS에서 사용하는 인코딩을 사용해서 파일을 해석해서 보여 주기 때문에 원래 작성된 것으로 볼 수 없을 것이다.
이와 마찬가지로 OutputStreamWriter를 이용해서 파일에 텍스트데이터를 저장할 때 생성자 OutputStreamWriter(OutputStream out, String encoding)을 이용해서 인코딩을 지정하지 않으면 OS에서 사용하는 인코딩으로 데이터를 저장할 것이다.
|참고| 시스템 속성에서 sun.jnu.encoding의 값을 보면 OS에서 사용하는 인코딩의 종류를 알 수 있다.
Properties prop = System.getProperties();
System.out.println(prop.get("sun.jnu.encoding"));
import java.io.*;
class BufferedReaderEx1 {
public static void main(String args[]) {
String line = "";
try {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
System.out.println("사용중인 OS의 인코딩 : " + isr.getEncoding());
do {
System.out.print("문장을 입력하세요. 마치시려면 q 를 입력하세요. >>");
line = br.readLine();
System.out.println("입력하신 문장 : " + line);
} while(!line.equalsIgnoreCase("q"));
// br.close(); // System.in 과 같은 표준 입출력은 닫지 않아도 된다.
System.out.println("프로그램을 종료합니다.");
} catch(IOException e) {}
}
}
BufferedReader의 readLine()을 이용해서 사용자의 화면입력을 라인단위로 입력받으면 편리하다. 그래서 BufferedReader와 InputStream인 System.in을 연결하기 위해 InputStreamReader를 사용하였다. JDK1.5부터는 Scanner가 추가되어 이와 같은 방식을 사용하지 않아도 간단하게 처리가 가능하다.
그리고, 현재 사용중인 OS의 인코딩을 확인하려면 생성자 InputStreamReader(InputStream in)을 사용해서 InputStreamReader의 인스턴스를 생성한 다음 getEncoding()을 호출하면 된다.