개인참고자료/자바(네트워크)

문자 스트림 - Char 배열 형태로 만든 후 출력하기(CharArrayReader, CharArrayWriter)

경진 2008. 7. 14. 23:34
Char 배열 형태로 만든 후 이 내용을 화면에 출력하기

ByteArrayInputStream과 ByteArrayOutputStream을 학습할 때 다뤘던 예제와 흡사한 예제이다. 다른점은 바이트 배열이 아니라 char 배열을 사용했다.

import java.io.*;

public class CharArrayInputOutputTest {

    public static void main(String[] args) {
        if(args.length != 1){
            System.out.println("사용법 : java CharArrayInputOutputTest 파일이름");
            System.exit(0);
        } // if end
       
        FileReader fis = null;
        CharArrayReader bais = null;
        CharArrayWriter baos = null;       
        try{
            fis = new FileReader(args[0]);
            baos = new CharArrayWriter();
            char[] buffer = new char[512];
            int readcount = 0;
           
            while((readcount = fis.read(buffer)) != -1){
                baos.write(buffer, 0, readcount);   
            }
           
            char[] fileArray = baos.toCharArray();
            System.out.println("파일의 내용을 모두 읽어들여 Char[]로 만들었습니다.");
            System.out.println("읽어들인 Char의 수 :" + fileArray.length);
           
            bais = new CharArrayReader(fileArray);
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
            while((readcount = bais.read(buffer)) != -1){
                bw.write(buffer, 0, readcount);   
                bw.flush();
            }
            System.out.println("\n\n");
            System.out.println("읽어들인 내용을 모두 출력하였습니다.");           
        }catch(Exception ex){
            System.out.println(ex);
        }finally{
            try{
                fis.close();
                bais.close();
                baos.close();
            }catch(IOException ioe){
                System.out.println(ioe);
            }
        }
    }
}

            fis = new FileReader(args[0]);
            baos = new CharArrayWriter();
            char[] buffer = new char[512];
            int readcount = 0;
           
            while((readcount = fis.read(buffer)) != -1){
                baos.write(buffer, 0, readcount);   
            }
           
            char[] fileArray = baos.toCharArray();

FileReader를 생성한 후, 파일로부터 읽어 들인 내용을 CharArrayWriter에 있는 writer 메소드로 출력한다. 출력한 결과는 CharArrayWriter의 내부 저장 공간에 쌓이게 된다. 파일 내용을 모두 CharArrayWriter에게 출력했다면 출력한 내용은 toCharArray() 메소드를 이용해서 char 배열 형태로 반환받을 수 있다.

            bais = new CharArrayReader(fileArray);
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
            while((readcount = bais.read(buffer)) != -1){
                bw.write(buffer, 0, readcount);   
                bw.flush();
            }

배열 fileArray를 CharArrayReader의 생성자에 지정함으로써 CharArrayReader가 배열 fileArray로부터 데이터를 읽어 들일 수 있게 한다. CharArrayReader는 char 배열 형태로 read() 메소드를 이용해서 읽어 들이기 때문에 바이트 배열을 출력하는 메소드를 가진 System.out을 사용할 수 없다.이를 해결하려고 System.out을 OutputStreamWriter의 인자로 지정해서 문자 단위의 입출력이 되게 했다. 또한 OutputStreamWriter에 있는 writer() 메소드를 이용해서 출력해도 되지만, 좀더 성능을 높이기 위해서 BufferedWriter의 생성자에 OutputStreamWriter 객체를 지정함으로써 병목현상을 없앴다.

BufferedWriter의 경우 writer() 메소드를 이용해서 출력한 후, flush() 메소드나 close() 메소드를 호출해야만 버퍼 안에 저장된 내용이 완전하게 출력된다.