[JAVA] ByteStream : DataInputStream / DataOutputStream

2019. 8. 7. 10:31 JAVA/Java IO

ByteStream : DataInputStream / DataOutputStream



DataInputStream과 DataOutputStream은 자바의 기본 자료형 데이터를 바이트 스트림으로 입출력하는 기능을 제공하는 ByteStream 클래스이다. 


DataInputStream과 DataOutputStream 은 FilterInputStream과 FilterOutputStream을 상속하고 있어, 객체 생성시에 InputStream과 OutputStream을 매개변수 인자로 가진다.


[JAVA] ByteStream : FilterInputStream / FilterOutputStream


이 클래스와 입출력 장치를 대상으로 하는 입출력 클래스를 같이 이용하면 자바의 기본 자료형 데이터를 파일 등 입출력 장치로 직접 입출력할 수 있다.


FileInputStream / FileOutputStream 과의 차이점은 자바 기본 자료형 데이터를 입/출력 할 수 있다는 것이다.

FileInputStream / FileOutputStream 은 byte[] 단위의 데이터만 입/출력을 할 수 있었다. 

하지만 DataStream Filter를 적용함으로써, 자바 기본 자료형(char, int, long, ...) 으로 데이터를 입력하고 출력할 수 있다.




위의 그림과 같이 DataInputStream / DataOutputStream은 데이터 입출력시 기본 자료형을 ByteStream으로 변환하여 파일 입/출력을 수행한다.


* DataInputStream / DataOutputStream 의 생성자


 DataInputStream / DataOutputStream 의 생성자

 설명

 DataInputStream(InputStream in)

- inputStream을 인자로 DataInputStream을 생성한다.

 DataOutputStream(OutputStream out)

- outputStream을 인자로 DataOutputStream을 생성한다.


* DataInputStream 의 메소드


DataInputStream의 메소드 

설명 

boolean readBoolean() throws IOException

- Stream으로부터 읽은 boolean을 반환한다.

byte readByte() throws IOException 

- Stream으로부터 읽은 byte를 반환한다. 

char readChar() throws IOException 

- Stream으로부터 읽은 char를 반환한다. 

double readDouble throws IOException 

- Stream으로부터 double을 반환한다. 

float readFloat() throws IOException 

- Stream으로부터 float을 반환한다. 

long readLong() throws IOException 

- Stream으로부터 long을 반환한다. 

short readShort() throws IOException 

- Stream으로부터short를 반환한다. 

int readInt() throws IOException

- Stream으로부터 int를 반환한다. 

void readFully(byte[] buf) 

throws IOException

- Stream으로부터 buf 크기만큼의 바이트를 읽어 buf[]에 저장한다 

void readFully(byte[] buf, int off, int len)

throws IOException

- Stream으로부터 len 길이만큼 바이트를 읽어 buf의 off 위치에 저장한다.

String readUTF() throws IOException

- UTF 인코딩 값을 얻어 문자열로 반환한다. 

static String readUTF(DataInput in)

throws IOException

- DataInput의 수정된 UTF 인코딩 값을 얻어 문자열로 반환한다.

int skipBytes(int n) throws IOException

- n 만큼 바이트를 skip 한다. 


* DataOutputStream의 메소드


 DataOutputStream의 메소드

설명 

void flush() throws IOException

- 버퍼를 출력하고 비운다. 

int size()

- Stream에 출력된 바이트 크기를 반환한다.

void write(int i) throws IOException

- int 형 i 값이 갖는 1바이트를 출력한다. 

void write(byte buf[], int index, int size)

throws IIOException 

- byte 배열 buf의 index 위치에서 size만큼 출력한다. 

void writeBoolean(boolean b) throws IOException 

- boolena을 1바이트 값으로 출력한다. 

void writeByte(int i) throws IOException 

- int를 4바이트 값으로 상위 바이트 먼저 출력한다. 

void writeBytes(String s) throws IOException 

- 문자열을 바이트 순으로 출력한다. 

void writeChar(int i) throws IOException 

- char를 2바이트 값으로 상위 바이트 먼저 출력한다. 

void writeChars(String s) throws IOException

- String 문자열을 char형으로 출력한다. 

void writeDouble(double d) throws IOException

- Double 클래스의 doubleToBits()를 사용하여 long으로 변환한 다음 long 값을 8바이트수량으로 상위바이트 먼저 출력한다.

void writeFloat(float f) throws IOException

- Float을 floatToBits()를 사용하여 변환한 다음 int 값을 4바이트 수량으로 상위 바이트 먼저 출력한다. 

void writeInt(int i) throws IOException 

- int의 상위 바이트 먼저 출력한다. 

void writeLong(long l) throws IOException 

- long 형의 인자값 출력한다. 

void writeShort(shrot s) throws IOException 

- short형의 인자값 출력한다. 

void writeUTF(String s) throws IOException

- UTF-8 인코딩을 사용해서 문자열을 출력한다. 



* DataInputStream / DataOutputStream 사용 예제


 

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;


public class DataStreamTest {

    public static void main(String[] args) {
       
        FileInputStream fis = null;
        DataInputStream dis = null;
       
        FileOutputStream fos = null;
        DataOutputStream dos = null;
       
        try{
           
            // "StreamFile.out" 파일을 출력하는 객체를 생성한다.
            // DataOutputStream Filter를 적용한다.
            fos = new FileOutputStream("StreamFile.out");
            dos = new DataOutputStream(fos);
           
            // "StreamFile.out" 파일에 각 기본형 데이터를 출력한다.
            dos.writeBoolean(false);
            dos.writeByte(Byte.MAX_VALUE);
            dos.writeChar('굿');
            dos.writeDouble(Double.MAX_VALUE);
            dos.writeFloat(Float.MIN_VALUE);
            dos.writeLong(Long.MAX_VALUE);
            dos.writeShort(Short.MAX_VALUE);
            dos.writeUTF("안녕하세요");
           
            // "StreamFile.out" 파일을 읽는 객체를 생성한다.
            // DataInputStream Filter를 적용한다.
            fis = new FileInputStream("StreamFile.out");
            dis = new DataInputStream(fis);
           
            // "StreamFile.out" 파일에서 각 기본형 데이터를 읽어온다.
            System.out.println(dis.readBoolean());
            System.out.println(dis.readByte());
            System.out.println(dis.readChar());
            System.out.println(dis.readDouble());
            System.out.println(dis.readFloat());
            System.out.println(dis.readLong());
            System.out.println(dis.readShort());
            System.out.println(dis.readUTF());
       
        }catch(Exception e){
            e.printStackTrace();
        }finally{
           
            if(dis != null) try{dis.close();}catch(IOException e){}
            if(fis != null) try{fis.close();}catch(IOException e){}
                        
            if(dos != null) try{dos.close();}catch(IOException e){}
            if(fos != null) try{fos.close();}catch(IOException e){}
                      
        }
       

    }

}




- FileOutputStream 으로 "StreamFile.out" 파일에 스트림 객체를 생성하고 DataOutputStream을 Filter로 적용하여, 자바 기본형 타입들로 파일에 데이터를 출력한다.


- FileInputStream 으로 "StreamFile.out" 파일에 스트림 객체를 생성하고 DataInputStream을 Filter로 적용하여, 자바 기본형 타입들로 파일의 데이터를 가져온다.


DataStreamTest.zip


JAVA API DOC : DataInputStream

JAVA API DOC : DataOutputStream



출처: https://hyeonstorage.tistory.com/239?category=578560 [개발이 하고 싶어요]