✔️ 자바 기본 자료형 데이터를 입/출력
이 전에 사용했던 FileReader
, FileWriter
, FileInputStream
, FileOutputStream
은 직접적으로 파일을 문자 / 바이트 형식으로 읽고 쓰는 클래스였다.
하지만 문자나 바이트형식으로도 읽고 쓸 때가 어려운 경우가 있는데, DataStream Filter
를 적용함으로써, 자바 기본 자료형(char, int, long, ...) 으로 데이터를 입력하고 출력할 수 있다.
DataStream
은 자바의 기본 데이터 타입별로 입출력하는 별도의 메서드가 있으며 기본 데이터를 매개 변수로 호출한다.
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();
}
}
✔️ 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()
메서드가 제안하는 만큼은 읽을 수 있음을 의미한다.
✔️ 스트림의 끝에 이를 경우 0을 반환한다.
그러나 일반적으로 read(byte[] input, int offset, int lnegth) 메소드는 스트림의 끝에 이를 경우 -1을 반환하고 읽을 데이터가 없는 경우 0을 반환한다.