자바

자바 입력 스트림과 출력 스트림 Java Reader, Writer

알통몬_ 2017. 4. 1. 19:46
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 


Reader : 문자 기반 입력 스트림의 최상위 클래스로써 추상 클래스입니다.

모든 문자 기반 입력 스트림은 Reader 클래스를 상속받아 만들어지며

FileReader, BufferedReader, InputStreamReader 클래스가 있습니다.


read()

 :  입력 스트림으로부터 한개의 문자(2Bytes)를 읽고 4Bytes 정수 타입으로 리턴합니다.

리턴된 4Bytes 중에 끝에 있는 2Bytes에만 문자 데이터가 들어있습니다.

예를 들어 스트림에 3개의 문자 즉, 6Bytes가 들어오면 read() 로 문자 하나 씩 세 번에 읽어올 수 있습니다.

read()가 리턴한 정수 값을 char타입으로 변환하면 읽은 문자를 읽을 수 있습니다.

char charData - (char)read();


더 이상 읽어올 문자가 없다면 read()는 -1을 리턴합니다.

Reader reader = new FileRead("파일 경로");

int readData;

while((readData = reader.read()) != -1) {

    char charData = (char) readData;

}


read(char[] cbuf )

 : 입력 스트림으로부터 매개값으로 주어진 문자 배열의 길이만큼 문자를 읽고, 배열에 자장, 읽은 문자 수를 리턴,

읽은 문자 수가 배열의 길이보다 작을 경우 읽은 수만큼 리턴합니다.

예를 들어 입력 스트림에 5개의 문자가 들어올 경우 길이가 2인 문자 배열로 2,2,1 이렇게 3번 읽을 수 있습니다.

이 메소드도 마찬가지로 더 이상 읽을 문자가 없다면 read()는 -1을 리턴합니다.

Reader reader = new FileRead("파일 경로");

int readData;

char[] cbuf = new char[2];

while((readData = reader.read(cbuf)) != -1) { ... }


입력 스트림으로부터 100개의 문자가 들어온다면 read()는 100번을 루핑해 읽어야 합니다.

read(char[] cbuf) 는 한번 읽을 때 주어진 배열의 길이만큼 읽기 때문에 루핑 횟수가 줄어듭니다.

즉 많은 양의 문자를 읽어야 하는 경우 read(char[] cbuf) 를 사용하는 것이 좋습니다.


read(char[] cbuf, int off, int len) 

: 입력 스트림으로부터 len 개의 문자만큼 읽고, 매개값으로 주어진 문자 배열 cbuf[off] 부턴 len까지 저장합니다.

읽은 문자 수인 len개만큼 리턴을 하고 읽은 문자 수가 len보다 작다면 읽은 수 만큼 리턴합니다.


이것 역시 더 이상 읽을 문자가 없다면 read()는 -1을 리턴합니다.

Reader reader = new FileRead("파일 경로");

int readData;

char[] cbuf = new char[100];

int readCharNumber = reader.read(cbuf, 0, 100);


close() :

Reader를 더 이상 사용하지 않을 경우 사용합니다.

reader.close();



Writer

추상 클래스이고 문자 기반 출력 스트림의 최상위 클래스

모든 문자 기반 클래스는 Writer 클래스를 상속 받아 만들어집니다.

FileWriter, BufferedWriter, PrintWriter, OutputStreamWriter 클래스가 있습니다.


write(int c)

 : 매개 변수로 주어진 int 값에서 끝에 있는 2Bytes만 출력 스트림으로 보냅니다.

  매개 변수가 int 타입이라 4Bytes를 모두 보낼 거 같지만 그렇지 않음.

Wirter writer = new FileWriter("파일경로");

char[] data = "알통몬".toCharArray();

for(int i = 0; i<data.length; i++){

    writer.write(data[i]); // "알", "통", "몬" 하나 씩 출력합니다.

}


write(char[] cbuf)

 : 매개 값으로 주어진 char[] 배열의 모든 문자를 출력 스트림으로 보냅니다.

Wirter writer = new FileWriter("파일경로");

char[] data = "알통몬".toCharArray();

writer.write(data); // "알통몬" 모두 출력합니다.


write(char[] cbuf, int off, int len)

 : cbuf[off]부터 len개의 문자를 출력 스트림으로 보냅니다.

Wirter w = new FileWriter("파일경로");

char[] data = "알통몬".toCharArray();

w.write(data, 1, 2); // "통몬" 만 출력합니다.


write(String str) , 

wirte(String str, int off, int len)

 : Writer는 문자열을 좀 더 쉽게 보내기 위해 write(String str) : [문자열 전체를 출력 스트림으로 보냅니다.]

wirte(String str, int off, int len)를 제공 : [주어진 문자열 off 순번부터 len개까지의 문자 보냅니다.]


문자 출력 스트림은 내부에 작은 버퍼가 있음 -> 데이터가 출력되기 전 버퍼에 쌓여 있다가 순서대로 출력.

 flush()는 남아있는 데이터를 모두 출력시키고 버퍼를 비우는 역할.

=> 프로그램에서 더 이상 출력할 문자가 없다면 flush()를 마지막에 호출하여 모든 문자가 출력되도록 해야함.

Writer를 사용하지 않을 경우는 close()를 호출, 시스템 자원을 풀어줌.


Writer w = new FileWriter("파일 경로");

String data = "알통몬 근육몬 괴력몬";

w.write(data);

w.flush();

w.close();



이상입니다.

반응형