기본 스트림을(In/OutputStream, Reader/Writer) 사용해서 데이터를 입출력 할 수 있지만, 데이터를 변환해서 입출력하거나, 데이터의 출력형식을 지정하고 싶은 경우, 입출력 성능을 향상시키고 싶을 경우에 기본 스트림에 보조 스트림을 연결하여 사용하면 편리하게 수행할 수 있다.
바이트 스트림과 문자 스트림을 연결할 수 있도록 도와주는 스트림
* InputStreamReader
* OutputStreamReader
프로그램이 입출력 소스와 직접 작업하지 않고 중간에 메모리 버퍼와 작업해 실행 성능을 향상 시킬 수 있다.
* BufferedOutputSteram / BufferedWriter
* BufferedInputStream / BufferedReader
ex)
package 버퍼성능비교;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class EnhancedBuffMain {
public static void main(String[] args) throws Exception {
FileInputStream fis = null;
FileOutputStream fos = null;
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
int data = -1;
long start = 0;
long end = 0;
fis = new FileInputStream("src/버퍼성능비교/forest.jpg");
bis = new BufferedInputStream(fis);
fos = new FileOutputStream("src/forest.jpg");
bos = new BufferedOutputStream(fos);
start = System.currentTimeMillis();
while((data = bis.read()) != -1) {
bos.write(data);
}
bos.flush();
end = System.currentTimeMillis();
bos.close(); fos.close(); bis.close(); fis.close();
System.out.println("사용했을 때: " + (end-start) + "ms");
}
}
바이트 스트림은 바이트 단위로 입출력하기 때문에 기본 데이터 타입인 boolean, char, short, int, long, float, double 단위로 입출력 할 수 없다. 그러나 DataInputStream과 DataOutputStream 보조 스트림을 연결하면 기본 데이터 타입으로 입출력이 가능하다.
DataInputStream dis = new DataInputStream(바이트입력스트림)
DataOutputStream dos = new DataOutputStream(바이트출력스트림)
-사용 예시-
public class DataInPutStream {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("primitive.db");
DataOutputStream dos = new DataOutputStream(fos);
dos.writeUTF("우영우");
dos.writeDouble(95.5);
dos.writeInt(1);
dos.writeUTF("동그라미");
dos.writeDouble(90.3);
dos.writeInt(2);
dos.flush();
dos.close();
FileInputStream fis = new FileInputStream("primitive.db");
DataInputStream dis = new DataInputStream(fis);
for(int i = 0; i < 2; i++) {
String name = dis.readUTF();
double score = dis.readDouble();
int order = dis.readInt();
System.out.println(name + " : " + score + " : " + order);
}
dis.close();
}
}
자바는 메모리에 생성된 객체를 파일 또는 네트워크로 출력 할 수 있다. 객체는 문자가 아니기 때문에 바이트 기반 스트림으로 출력해야 하는데 그러기 위해서는 일렬로 연속적인 바이트로 변경해야 한다 (객체 직렬화). 반대로 파일에 저장되어 있거나 네트워크에서 전송된 객체를 읽을 수도 있는데, 입력 스트림으로 부터 읽어들인 연속적인 바이트를 객체로 복원하는 것을 역직렬화라고 한다.
Serializable 인터페이스를 implements하여 구현. 객체 직렬화 시 private 필드를 포함한 모든 필드를 바이트로 변환하지만 transient키워드를 사용한 필드는 직렬화에서 제외.
직렬화된 객체를 역직렬화할 때는 직렬화 했을 때와 같은 클래스를 사용, 클래스 이름이 같더라도 클래스 내용이 변경된 경우 역직렬화 실패