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

바이트 기반 스트림 - 파일의 저장과 읽기(DataInputStream, DataOutputStream)

경진 2008. 7. 13. 17:10
DataInputStream과 DataOutputStream을 이용한 파일의 저장과 읽기 

DataInputStrream을 이용해서 다향한 형식의 기본형 데이터 파일에 저장한 후, DataOutputStream을 이용해서 파일에 저장된 내용을 읽어 들여 출력한다.

DataInputStream과 DataOutputStream만으로는 해결하지 못한다. DataInputStream과 DataOutputStream 모두는 인자가 없는 생성자, 즉 기본 생성자가 없다. DataInputStream은 InputStream을 인자로 받아들이고 DataOutputStream은 OutputStream을 인자로 받아들인다.

그런데 입력을 파일로부터 받아들여야 하고, 출력은 파일에 해야 한다는 문제가 있다. 생성자는 읽어 들여야 할 대상이나, 써야 할 대상이 오게 된다. 따라서 이 부분을 생각한다면 DataInputStream은 생성자에 InputStream을 받아들이기 때문에, InputStream을 상속받는 객체 중 Stream을 받아들이기 때문에, InputStream을 상속받는 객체 중에서 파일로부터 읽어 들이는 객체를 지정해야 한다. 그리고 DataOutputStream은 생성자에 OutputStream을 받아들이기 때문에, OutputStream을 상속받는 객체 중에서 파일로부터 읽어 들이는 객체를 지정해야 한다.

FileOutputStream과 DataOutputStream을 이용해서, boolean, byte, int, double, 문자열을 차례대로 data.bin 파일에 저장하는 예제다.

import java.io.*;

public class DataOutputStreamTest {

    public static void main(String[] args) {
        FileOutputStream fis = null;
        DataOutputStream dis = null;
        try{
            fis = new FileOutputStream("data.bin");
            dis = new DataOutputStream(fis);
            dis.writeBoolean(true);
            dis.writeByte((byte)5);
            dis.writeInt(100);
            dis.writeDouble(200.5);
            dis.writeUTF("hello world");
            System.out.println("저장하였습니다.");
        }catch(Exception ex){
            System.out.println(ex);
        }finally{
            try {
                fis.close();
            } catch (IOException e) {}
            try {
                dis.close();
            } catch (IOException e) {}
        }
    }
}

        FileOutputStream fis = null;
        DataOutputStream dis = null;
        try{
            fis = new FileOutputStream("data.bin");
            dis = new DataOutputStream(fis);

FileOutputStream 객체의 생성자에 data.bin이라는 이름의 파일을 지정했다는 것은 FileOutputStream이 data.bin 파일에 출력을 한다. 그리고 이런한 FileOutputStream의 객체를 DataOutputStream의 생성자에 지정했다. 이는 DataOutputStream에 있는 메소드를 이용해서 출력하는데, DataOutputStream은 내부적으로 FileOutputStream을 이용한다. 즉, DataOutputStream에 있는 메소드를 이용해서 출력하면, data.bin 파일에 저장된다.

            dis.writeBoolean(true);
            dis.writeByte((byte)5);
            dis.writeInt(100);
            dis.writeDouble(200.5);
            dis.writeUTF("hello world");
            System.out.println("저장하였습니다.");

DataOutputStream에 있는 writeBoolean(), writeByte(), writeInt(), writeDouble(), writeUTF() 메소드를 차례대로 호출했다. 그 결과 data.bin 파일에 차례대로  boolean, byte, int, double, String이 저장된다.

DataOutputStreamTest에 의해서 생성된 파일인 data.bin으로부터 데이터를 읽어 들여 출력하는 예제이다.
DataInputStream 객체를 생성하는 부분과 DataInputStream의 메소드를 호출하는 순서를 중요하게 보자!

import java.io.*;

public class DataInputStreamTest {

    public static void main(String[] args) {
        FileInputStream fis = null;
        DataInputStream dis = null;
        try{
            fis = new FileInputStream("data.bin");
            dis = new DataInputStream(fis);
            boolean b = dis.readBoolean();
            byte b2 = dis.readByte();
            int i = dis.readInt();
            double d = dis.readDouble();
            String s = dis.readUTF();
            System.out.println("boolean :" + b);
            System.out.println("byte :" + b2);
            System.out.println("int :" + i);
            System.out.println("double :" + d);
            System.out.println("String :" + s);
        }catch(Exception ex){
            System.out.println(ex);
        }finally{
            try {
                fis.close();
            } catch (IOException e) {}
            try {
                dis.close();
            } catch (IOException e) {}
        }
    }
}

        FileInputStream fis = null;
        DataInputStream dis = null;
        try{
            fis = new FileInputStream("data.bin");
            dis = new DataInputStream(fis);

FileInputStream 생성자에 data.bin 파일명을 지정함으로서, FileInputStream은 data.bin 파일로 부터 데이터를 읽어 들인다. 이러한 fileInputStream의 객체를 DataInputStream 생성자에 인자로 지정함으로써, DataInputStream은 FileInputStream을 통해서 데이터를 읽어 들이게 된다.

            boolean b = dis.readBoolean();
            byte b2 = dis.readByte();
            int i = dis.readInt();
            double d = dis.readDouble();
            String s = dis.readUTF();

DataOutputStreamTest에서 파일에 출력한 순서가 boolean, byte, int, double, String 순서였기 때문에 DataInputStream을 통해서 읽어 들일 때에도 같은 순서로 읽어 들여야한다.

            System.out.println("boolean :" + b);
            System.out.println("byte :" + b2);
            System.out.println("int :" + i);
            System.out.println("double :" + d);
            System.out.println("String :" + s);

DataInputStream을 통해 읽어 들인 데이터를 표준 출력 장치인 모니터에 출력한다.

결과화면