[Java] DataStream

JTI·2023년 1월 19일
0

☕️  Java

목록 보기
54/59

💡 DataInputStream / DataOutputStream


✔️ 자바 기본 자료형 데이터를 입/출력

이 전에 사용했던 FileReader, FileWriter, FileInputStream, FileOutputStream 은 직접적으로 파일을 문자 / 바이트 형식으로 읽고 쓰는 클래스였다.

하지만 문자나 바이트형식으로도 읽고 쓸 때가 어려운 경우가 있는데, DataStream Filter 를 적용함으로써, 자바 기본 자료형(char, int, long, ...) 으로 데이터를 입력하고 출력할 수 있다.

DataStream 은 자바의 기본 데이터 타입별로 입출력하는 별도의 메서드가 있으며 기본 데이터를 매개 변수로 호출한다.

📎 DataInputStream / DataOutputStream 생성자


📎 DataInputStream 메서드

📎 DataOutputStream 메서드

✏️ DataInputStream / DataOutputStream 활용


import java.io.*;

public class IOEx1 {
    public static void write() {
      FileOutputStream fos = null;
      DataOutputStream dos = null;

      try {
          fos = new FileOutputStream("temp.txt");
          dos = new DataOutputStream(fos);

          dos.writeInt(500);
          dos.writeBoolean(true);
          dos.writeUTF("눈누");
          dos.writeDouble(3.14);

          dos.flush();

      } catch (IOException e) {
          e.printStackTrace();
      } finally {
          IOUtil.closeAll(dos, fos);
      }
    }
    
    public static void read() {
        FileInputStream fis = null;
        DataInputStream dis = null;

        try{
            fis = new FileInputStream("temp.txt");
            dis = new DataInputStream(fis);

            System.out.println(dis.readInt());
            System.out.println(dis.readBoolean());
            System.out.println(dis.readUTF());
            System.out.println(dis.readDouble());


        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            IOUtil.closeAll(dis, fis);
        }

    }
    
    public static void main(String[] args) {
        write();
        read();
    }

}

✏️ 활용 2_객체

✔️ Some 객체

public class Some {
	private int intValue;
	private String strValue;
	private double doubleValue;
	
	public Some() {	}
	
	public Some(int intValue, String strValue, double doubleValue) {
		super();
		this.intValue = intValue;
		this.strValue = strValue;
		this.doubleValue = doubleValue;
	}
	
	public int getIntValue() {
		return intValue;
	}
    
	public void setIntValue(int intValue) {
		this.intValue = intValue;
	}
    
	public String getStrValue() {
		return strValue;
	}
    
	public void setStrValue(String strValue) {
		this.strValue = strValue;
	}
    
	public double getDoubleValue() {
		return doubleValue;
	}
    
	public void setDoubleValue(double doubleValue) {
		this.doubleValue = doubleValue;
	}
	
	@Override
	public String toString() {
		return "Some [intValue=" + intValue + ", strValue=" + strValue + ", doubleValue=" + doubleValue + "]";
	}
}

✔️ DataInputStream / DataOutputStream

import java.io.*;

public class IOEx2 {
    public static void write() {
        Some[] arr = {
                new Some(1, "ㄱ", 0.11),
                new Some(2, "ㄴ", 0.22),
                new Some(3, "ㄷ", 0.33),
                new Some(4, "ㄹ", 0.44),
                new Some(5, "ㅁ", 0.55)
        };
        DataOutputStream dos = null;

        try{
            dos = new DataOutputStream(new FileOutputStream("some.txt"));

            for(Some temp : arr) {
                dos.writeInt(temp.getIntValue());
                dos.writeUTF(temp.getStrValue());
                dos.writeDouble(temp.getDoubleValue());
            }
            dos.flush();

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            IOUtil.closeAll(dos);
        }
    }

    public static void read() {
        DataInputStream dis = null;

        try{
            dis = new DataInputStream(new FileInputStream("some.txt"));

            // 현재 읽을수 있는 바이트수를 반환한다.
            while(dis.available() > 0) {
                Some s = new Some(
                        dis.readInt(),
                        dis.readUTF(),
                        dis.readDouble()
                );
                System.out.println(s);
            }


        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            IOUtil.closeAll(dis);
        }

    }

    public static void main(String[] args) {
        write();
        read();
    }
}

📎 available

✔️ 대기없이 즉시 읽을 수 있는 바이트 수를 반환한다.

필요한 데이터를 모두 읽을 수 있을 때까지 실행이 대기되는 상황을 원하지 않을 경우, 대기없이 즉시 읽을 수 있는 바이트 수를 반환하는 available() 메서드를 사용하여 읽을 바이트 수를 결정할 수 있다.

이 메소드는 읽을 수 있는 최소 바이트 수를 반환한다.

사실 좀 더 많은 바이트를 읽을 수도 있겠지만, 최소한 available() 메서드가 제안하는 만큼은 읽을 수 있음을 의미한다.

✔️ 스트림의 끝에 이를 경우 0을 반환한다.

그러나 일반적으로 read(byte[] input, int offset, int lnegth) 메소드는 스트림의 끝에 이를 경우 -1을 반환하고 읽을 데이터가 없는 경우 0을 반환한다.

profile
Fill in my own colorful colors🎨

0개의 댓글