'입출력'에 해당되는 글 10건

  1. 2007.12.07 자바공부-5.캐릭터 스트림(Reader/Writer) 1

Reader,Writer InputStream/OutputStream과 더불어 자바에서 가장 기본이 되는

읽기,쓰기에 관한 또 다른 클래스입니다.

InputStream이 바이트 스트림의 가장 꼭대기에 있는 것처럼 Reader는 캐릭터 스트림의

가장 꼭대기에 있습니다.

 Reader는 자바에서 캐릭터 스트림으로부터 읽을 때 사용되는 가장 기본이 됩니다.

읽기에 사용하는 모든 캐릭터 스트림은 Reader를 상속했기 때문에 Reader가 정의한

메소드는 캐릭터 스트림의 기본중의 기본이 됩니다.

6 - 3은 캐릭터 스트림의 기본인 Reader클래스에 정의된 메소드를 설명합니다.

 

Reader

int available()

스트림으로부터 지금 당장 읽을 수 있는 캐릭터가

몇 캐릭터인지 알아봅니다.

스트림으로부터 당장 읽을 수 있는 캐릭터의 수

int close()

스트림을 닫고, 스트림과 결합되어있는 시스템 리소스를

풀어줍니다.

int mark(int readlimit)          

스트림에서 현재의 위치를 표시합니다.

boolean markSupported()

스트림이 mark(int readlimit)를 지원하는지 검사합니다

스트림이 mark(int readlimt)를 지원하면 true

그외 false

abstract int read()       

스트림으로부터 한 캐릭터를 읽습니다.

스트림으로부터 읽은 캐릭터

int read(char[] c)       

스트림으로 부터 캐릭터를 읽어들여서 캐릭터 배열 c

저장합니다

스트림으로부터 읽은 캐릭터의 수

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

스트림으로 부터 len 캐릭터를 읽어,배열 c off번째

위치에부터 저장합니다.

스트림으로부터 읽은 캐릭터 수

void reset()

스트림의 다음에 읽을 위치를 마지막 mark(int readlimit)

를 호출했을때로 이동시킵니다.

long skip(long n)

스트림으로부터 n캐릭터를 건너뜁니다.

6 - 3

 

Reader InputStream과 매우 유사한 메소드들을 정의하고 있습니다만 근본적인 차이점

Reader는 캐릭터기반의 데이터를 읽고, InputStream은 바이트 기반의 데이터를 읽는데

있습니다.

바이트는 말 그대로 단순한 한 바이트 값에 불과하지만 캐릭터는 그 자체적으로 의미가

있는 문자입니다. 캐릭터를 읽는 다는 것은 단순히 스트림으로부터 의미가 없는 바이너리

형태의 데이터를 읽는 것과는 다릅니다.  자바에서 캐릭터는 2바이트 유니코드로 이루어져

있습니다.  2바이트 유니코드로 이루어진 캐릭터 데이타를 좀더 효율적으로 처리하기

위해서 InputStream외에 Reader 클래스가 탄생하게 된 궁극적인 이유라 하겠습니다.

 

Writer

void close()

스트림을 닫고, 스트림과 결합되어있는 시스템 리소스를

풀어줍니다

void flush()

아직 쓰지 않은 데이타를 스트림으로 쓰게 합니다.

void write(char[] c)

바이트 배열 b의 바이트를 스트림으로 씁니다.

void write(char[] c,int off, int len)

바이트 배열 b의 바이트를 off위치부터 len길이만큼만

스트림에 씁니다.

void abstract  void write(int b)

정수형 b를 스트림으로 쓰게 합니다.

6 - 4

6 - 4 OutputStream과 더불어 자바에서 가장 기본이 되는 쓰기에 관한 클래스인

Writer에 정의된 메소드에 대한 설명입니다.

Writer는 자바에서 캐릭터 기반의 데이터를 쓸 때 가장 기본이 됩니다.

쓰기를 위한 모든 캐릭터 스트림은 Writer를 상속하기 때문에 Writer가 정의한 메소드는

쓰기 캐릭터 스트림의 기본중의 기본이 되는 메소드입니다.

OutputStream을 사용할 것인지 Writer를 사용할 것인지는 쓰는 데이타의 종류에 따라

선택할 수 있습니다. 쓰는 데이타가 바이트 형태라면 두번 볼것 없이 OutputStream입니다.

캐릭터 형태라면 당연히 Writer가 유용하겠지요.

 

import java.io.*;

/**

* Reader의 기능을 보여줍니다.

*/

public class ReaderDemo {

             public static void main(String[] args) {

                           if (args.length != 2) {

                                        System.out.println("java -classpath CLASSPATH ReaderDemo

input output");

                                        System.exit(1);

                           }

                           String in = args[0];             // copy할 원래파일

                           String out = args[1];           // copy한후 만들어지는 파일

                          

                           Reader r = null;

                           Writer w = null;

                           try {

                                        r = new FileReader(in);      

                                        w = new FileWriter(out);

                                       

                                        int c = 0;

                                        // 파일 copy

                                        while((c = r.read()) != -1) {

                                                     w.write(c);

                                        }

                          

                                        w.flush();

                           }

                           catch(IOException io) {

                                        io.printStackTrace();

                           }

                           finally {

                                        try {

                                                     if (r != null) {

                                                                  r.close();            

                                                     }

                                                     if (w != null) {

                                                                  w.close();

                                                     }

                                        }

                                        catch(Exception ignore) { }

                           }

             }

}

예제 6 - 4 ReaderDemo.java

 

예제 6 - 4 ReaderDemo클래스는 Reader로 부터 한 캐릭터를 읽고 읽은 캐리터를

Writer로 쓰고 있습니다.

Reader로 사용된 객체는 Reader를 상속한 FileReader객체를 사용하고 있고,

Writer로 사용된 객체는 Writer를 상속한 FileWriter객체를 사용합니다.

여기서 간명하게 추리할 수 있는 것은 FileReader  역시 Reader라는 것과, FileWriter

Writer라는 사실입니다. 그리고 Reader FileReader로부터 만들어졌기 때문에,

읽고 있는 캐릭터가 파일로부터 읽혀진다는 것과 Writer FileWriter로 만들어졌기 때문에

쓰여지는 캐릭터가 파일로 저장된다는 것을 짐작할 수 있습니다.

 결과적으로 보면 ReaderDemo는 파일을 복사하는 셈입니다.

 

사용자 삽입 이미지
그림 6 - 4 [ run ReaderDemo]

 

 

Posted by
,