반응형
DataInputStream과 DataOutputStream
자료가 메모리에 저장된 상태 그대로 읽거나 쓰는 스트림
DataInputStream 메서드
메서드 | 설명 |
byte readByte() | 1바이트를 읽어 반환합니다 |
boolean readBoolean() | 읽은 자료가 0이 아니면 true, 0이면 false를 반환 |
char readChar() | 한 문자를 읽어 반환 |
short readShort() | 2바이트를 읽어 정수 값을 반환 |
int readInt() | 4바이트를 읽어 정수 값을 반환 |
long readLong() | 8바이트를 읽어 정수 값을 반환 |
float readFloat() | 4바이트를 읽어 실수 값을 반환 |
double readDouble() | 8바이트를 읽어 실수 값을 반환 |
String readUTF() | 수정된 UTF-8 인코딩 기반으로 문자열을 읽어 반환 |
DataStreamTest.java
package ch63;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class DataStreamTest {
public static void main(String[] args) {
try (FileOutputStream fos = new FileOutputStream("data.txt");
DataOutputStream dos = new DataOutputStream(fos)){
dos.writeByte(100);
dos.writeChar('A');
dos.writeInt(10);
dos.writeFloat(3.14f);
dos.writeUTF("TEST");
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
try (FileInputStream fis = new FileInputStream("data.txt");
DataInputStream dis = new DataInputStream(fis)){
System.out.println(dis.readByte());
System.out.println(dis.readChar());
System.out.println(dis.readInt());
System.out.println(dis.readFloat());
System.out.println(dis.readUTF());
} catch (Exception e) {
// TODO: handle exception
}
System.out.println("실행완료");
}
}
직렬화(serialization)
- 인스턴스의 상태를 그대로 파일 저장하거나 네트워크로 전송(serialization)하고 이를 다시 복원(deserialization)하는 방식
- 자바에서는 보조 스트림을 활용하여 직렬화를 제공함
ObjectInputStream과 ObjectOutputStream
생성자 | 설명 |
ObjectInputStream(InputStream in) | InputStream을 생성자의 매개변수로 받아 ObjectInputStream을 생성 |
ObjectOutputStream(OutputStream out) | OutputStream을 생성자의 매개변수로 받아 ObjectOutputStream을 생성 |
Serializable 인터페이스
- 직렬화는 인스턴스의 내용이 외부로 유출되는 것이므로 프로그래머가 해당 객체에 대한 직렬화 의도를 표시해야 함
- 구현 코드가 없는 marker interface
- transient: 직렬화 하지 않으려는 멤버 변수에 사용함 (Socket등 직렬화 할 수 없는 객체)
SerializationTest.java
package ch64;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
// 직렬화 명시를 해주어야 한다.
class Person implements Serializable{
String name;
String job;
public Person() {
}
public Person(String name, String job) {
super();
this.name = name;
this.job = job;
}
@Override
public String toString() {
return "Person [name=" + name + ", job=" + job + "]";
}
}
public class SerializationTest {
public static void main(String[] args) {
Person personLee = new Person("이순신", "대표이사");
Person personKim = new Person("김유신", "상무이사");
// 직렬화
try (FileOutputStream fos = new FileOutputStream("serial.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos)){
oos.writeObject(personLee);
oos.writeObject(personKim);
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
// 복원
try (FileInputStream fis = new FileInputStream("serial.txt");
ObjectInputStream ois = new ObjectInputStream(fis)){
Person pLee = (Person) ois.readObject();
Person pKim = (Person) ois.readObject();
System.out.println(pLee);
System.out.println(pKim);
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
}
}
Externalizable 인터페이스
- writerExternal()과 readExternal() 메서드를 구현해야 한다.
- 프로그래머가 직접 객체를 읽고 쓰는 코드를 구현 할 수 있음
SerializationTest2.java
package ch64;
import java.io.Externalizable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;
// 직렬화 명시를 해주어야 한다.
class Person2 implements Externalizable{
String name;
String job;
public Person2() {
}
public Person2(String name, String job) {
super();
this.name = name;
this.job = job;
}
@Override
public String toString() {
return "Person [name=" + name + ", job=" + job + "]";
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
// TODO Auto-generated method stub
out.writeUTF(name);
out.writeUTF(job);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
// TODO Auto-generated method stub
name = in.readUTF();
// job = in.readUTF();
}
}
public class SerializationTest2 {
public static void main(String[] args) {
Person2 personLee = new Person2("이순신", "대표이사");
Person2 personKim = new Person2("김유신", "상무이사");
// 직렬화
try (FileOutputStream fos = new FileOutputStream("serial.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos)){
oos.writeObject(personLee);
oos.writeObject(personKim);
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
// 복원
try (FileInputStream fis = new FileInputStream("serial.txt");
ObjectInputStream ois = new ObjectInputStream(fis)){
Person2 pLee = (Person2) ois.readObject();
Person2 pKim = (Person2) ois.readObject();
System.out.println(pLee);
System.out.println(pKim);
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
}
}
반응형
'언어 > JAVA' 카테고리의 다른 글
데코레이터 패턴 (0) | 2021.05.23 |
---|---|
입출력 클래스(File, RandomAccessFile) (0) | 2021.05.23 |
여러가지 보조 스트림 클래스 (0) | 2021.05.23 |
문자단위 입출력 스트림 (0) | 2021.05.23 |
OutputSteam (출력 스트림) (0) | 2021.05.23 |