[Java] IO 기반 입출력 및 네트워킹 ②

kiteB·2022년 4월 27일
0

Java2

목록 보기
23/36
post-thumbnail

[ Reader ]

문자 기반 입력 스트림의 최상위 클래스추상 클래스이다.

모든 문자 기반 입력 스트림은 이 클래스를 상속받아서 만들어진다.

✅ Reader 클래스의 주요 메소드


read() 메소드

입력 스트림으로부터 한 개의 문자(2바이트)를 읽고 4바이트 int 타입으로 리턴한다. 리턴된 4바이트 중 끝에 있는 2바이트에 문자 데이터가 들어 있다.

  • read() 메소드가 리턴한 int 값을 char 타입으로 변환하면 읽은 문자를 얻을 수 있다.
char charData = (char) read();
  • 더 이상 입력 스트림으로부터 문자를 읽을 수 없다면 -1을 리턴한다.

🐥 예제

Reader reader = new FileReader("C:/test.txt");
int readData;
while ((readData = reader.read()) != -1) {
    char charData = (char) readData;
}

read(char[] cbuf) 메소드

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

  • 실제로 읽은 문자 수가 배열의 길이보다 작을 경우 읽은 수만큼만 리턴한다.
  • 입력 스트림으로부터 문자를 더 이상 읽을 수 없다면 -1을 리턴한다.

🐥 예제

Reader reader = new FileReader("C:/test.txt");
int readCharNo;
char[] cbuf = new char[2];
while ((readCharNo = 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개보다 작을 경우 읽은 수만큼만 리턴한다.
  • 입력 스트림으로부터 더 이상 문자를 읽을 수 없다면 -1을 리턴한다.
  • read(char[] cbuf)와의 차이점은
    • 한 번에 읽어들이는 문자 수를 len 매개값으로 조절할 수 있으며,
    • 배열에서 저장이 시작되는 인덱스를 지정할 수 있다.
  • 만약 off를 0으로, len을 배열의 길이로 준다면 read(char[] cbuf)와 동일하다.
//read(char[] cbuf)
Reader reader = ...;
char[] cbuf = new char[100];
int readCharNo = reader.read(cbuf);
//read(char[] cbuf, int off, int len)
Reader reader = ...;
int readCharNo = reader.read(cbuf, 0, 100);

close() 메소드

마지막으로 Reader를 더 이상 사용하지 않을 경우에는 close() 메소드를 호출해서 Reader에서 사용했던 시스템 자원을 풀어준다.

reader.close();

[ Writer ]

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

모든 문자 기반 출력 스트림 클래스는 이 클래스를 상속받아서 만들어진다.

✅ Writer 클래스의 주요 메소드


write(int c) 메소드

매개 변수로 주어진 int 값에서 끝에 있는 2바이트(한 개의 문자)만 출력 스트림으로 보낸다.

🐥 예제

Writer writer = new FileWriter("C:/test.txt");
char[] data = "홍길동".toCharArray();
for (int i = 0; i < data.length; i++) {
    writer.write(data[i]);	//"홍", "길", "동"을 하나씩 출력
}

write(char[] cbuf) 메소드

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

🐥 예제

Writer writer = new FileWriter("C:/test.txt");
char[] data = "홍길동".toCharArray();
writer.write(data);	//"홍길동" 모두 출력

write(char[] cbuf, int off, int len) 메소드

c[off]부터 len개의 문자를 출력 스트림으로 보낸다.

🐥 예제

Writer writer = new FileWriter("C:/test.txt");
char[] data = "홍길동".toCharArray();
writer.write(data, 1, 2);	//"길동"만 출력

write(String str)와 write(String str, int off, int len) 메소드

Writer는 문자열을 좀 더 쉽게 보내기 위해 write(String str)write(String str, int off, int len) 메소드를 제공한다.

  • write(String str)문자열 전체를 출력 스트림으로 보낸다.
  • write(String str, int off, int len)주어진 문자열 off 순번부터 len개까지의 문자를 보낸다.

🐥 예제

Writer writer = new FileWriter("C:/test.txt");
String data = "안녕 자바 프로그램";
writer.flush();
writer.close();
  • 문자 출력 스트림은 내부에 작은 버퍼(buffer)가 있어서 데이터가 출력되기 전에 버퍼가 쌓여있다가 순서대로 출력된다.
  • flush() 메소드는 버퍼에 잔류하고 있는 데이터를 모두 출력시키고 버퍼를 비우는 역할을 한다.
  • 프로그램에서 더 이상 출력할 문자가 없다면 flush() 메소드를 마지막으로 호출하여 모든 문자가 출력되도록 해야 한다.
  • Writer를 더 이상 사용하지 않을 경우에는 close() 메소드를 호출해서 Writer에서 사용했던 시스템 자원을 풀어준다.
profile
🚧 https://coji.tistory.com/ 🏠

0개의 댓글