관리 메뉴

드럼치는 프로그래머

[JAVA] Input / Output Stream 본문

★─Programing/☆─JAVA

[JAVA] Input / Output Stream

드럼치는한동이 2007. 10. 29. 11:47

1. Stream

  대부분의 언어에서 입출력을 수행하는 것은 결코 간단한 얘기는 아니다. 그러나 스트림을 지원하는 언어라면 조금은 얘기가 틀려진다. 스트림은 입출력을 위임받아 처리하는 하나의 단위를 의미하는데, 스트림의 정의는 바이트의 순차적 입출력 방식이다.

  이것은 입출력을 수행할 데이터를 바이트의 배열 형태로 바꾸어 입출력을 수행하는 방식으로 데이터가 순서대로 입력과 출력이 이루어진다는 말이다. 이 스트림 방식을 사용하게되면 하드웨어가 어떻게 바뀌더라도 일관된 방식으로 입출력을 수행할 수 있다.

  자바에서 입출력을 수행하기 위해 java.io 패키지로 제공되며 이 패키지를 이용하면 스트림 방식의 입출력이 가능하다.


2. InputStreamReader / OutputStreamWriter 클래스

  Reader와 Writer 클래스는 Object 클래스의 바로 하위 클래스이다. 이것들로부터 바이트 입출력 스트림 상속시켰는데, Buffered Reader/Writer와 InputStreamReader/Writer가 대표적이다.

  InputSreamReader와 Writer를 이용하여 바이트의 입출력을 수행해보자.

import java.io.*;

public class ReWriter {

        public static void main(String[] args) {

                InputStreamReader ir = new InputStreamReader(System.in);

                OutputStreamWriter or = new OutputStreamWriter(System.out);

               

                int temp;

                try{

                        while((temp=ir.read())!=-1)

                                System.out.println((char)temp);

                }catch(IOException e){}

        }

}

  위의 예에서 ir.read() 메서드의 리턴형은 byte형이다. 즉, 형 그대로 출력하게 되면 숫자가 나타나게 된다. 이것을 우리가 원하는 문자로 보여주기 위해서는 char형으로 캐스트 연산되어야 한다.

 

3. BufferedReader / BuffersWriter

  위의 방식에서 더욱 개선된 버퍼를 이용한 입출력 방식이다. 버퍼는 임시기억장치를 의미하는데 입출력 장치과 CPU 사이에서 위치해, 조금 더 효과적인 입출력을 지원하는 방식이다. 예를 들어 입출력 장치에서 입출력이 일어나면 CPU는 입출력이 완료될때까지 대기해야 하는데 버퍼를 사용함으로서 이러한 단점을 줄이면서, 버퍼에 줄을 저장할 수 있기 때문에 줄 단위 입출력이 가능하다.

import java.io.*;

public class StringInput {

        public static void main(String[] args){

                String inputString;

                String text="String Test..";

                try{

                        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

                        BufferedWriter bw = new BufferedWriter(

                        new OutputStreamWriter(new FileOutputStream(text)));

                        while((inputString = br.readLine()) != null)

                                bw.write(inputString + "\n");

                        bw.close();

                        br.close();

                }catch(IOExcetion e){}

        }

}


4. FileReader / FileWriter

  기본 문자 인코딩을 이용해서 파일의 입출력을 담당하는 클래스이다. 이 클래스를 사용하면 파일에 읽고 쓰는 것이 가능하다. 다음은 파일 복사의 예이다.

import java.io.*;

public class FileCopy {

  public static void main(String[] args) {

    try {

      FileReader input = new FileReader("FileCopy.java");

      FileWriter output = new FileWriter("Test.txt");

      int charsRead;

      while((charsRead = input.read()) != -1) {

        output.write(charsRead);

      }

      input.close();

      output.close();

    }

    catch(IOException e) {

      e.printStackTrace();

    }

  }

}


5. 직렬화(Serializable)

  직렬화란 객체를 입출력하기 위한 방식이다. 실제로 위까지의 예제는 모두 기본 데이터형므로 바이트의 배열형식으로 내보는 것이 그리 어려운 얘기는 아니었다. 그러나 객체를 바이트 형의 배열로 변환하는 것은 그리 간단한 얘기가 아니다.

  다행스럽게도 자바에서는 직렬화라는 방식의 객체를 바이트 배열로 변환해주는 클래스가 지원된다.

public class User {

        private int number;

        private String name;

        private String subject;

       

        public User(int number, String name, String subject){

                this.number = number;

                this.name = name;

                this.subject = subject;         

        }

       

        public void print(){

                System.out.println("번호 : "+number);

                System.out.println("이름 : "+name);

                System.out.println("학과 : "+subject);

        }

}


import java.io.*;

public class SerialTest {

        public static void main(String[] args) {

                FileOutputStream fs;

                ObjectOutputStream os;

                try{

                        fs = new FileOutputStream("Serial.ser");

                        os = new ObjectOutputStream(fs);

           

                    User ob1=new User(1, "홍길동", "컴퓨터");

                    User ob2=new User(2, "이순신", "수학과");

                    User ob3=new User(3, "김좌진", "전자과");

                       

                    os.writeObject(ob1);

                    os.writeObject(ob2);

                    os.writeObject(ob3);

                   

                    os.close();

                }catch(FileNotFoundException e){

            }catch(IOException e){}

        }

}

import java.io.*;

public class SerialTest {

        public static void main(String[] args) {

                FileInputStream fs;

                ObjectInputStream os;

                try{

                        fs = new FileInputStream("Serial.ser");

                        os = new ObjectInputStream(fs);

           

                    User ob;

                    while((ob=(User)os.readObject())!=null)

                        ob.print();

                   

                    os.close();

                }catch(FileNotFoundException e){

                }catch(ClassNotFoundException e){

            }catch(IOException e){}

        }

}

 


Comments