Input(입력), Output(출력)
데이터의 흐름(키보드 or 파일 → 프로그램 → 모니터 or 파일)
바이트 단위로 데이터를 입출력하는 스트림
InputStream | OutputStream |
---|---|
abstract int read() | abstract void write(int b) |
int read(byte[]b) | void write(byte []b) |
int read(byte []b, int off, int len) | void write(byte []b, int off, int len |
입력스트림 | 출력스트림 | 대상 |
---|---|---|
FileInputStream | FileOutputStream | 파일 |
PipedInputStream | PipedOutputStream | 메모리 |
AudioInputStream | AudioOutputStream | 오디오 |
ByteArrayInputStream | ByteArrayOutputStream | 프로세스 |
* 데이터를 읽거나 쓰는 대상에 따라서 적절한 스트림을 사용한다.
실제 바이트 기반 스트림의 성능을 향상시키는 역할
입력보조스트림 | 출력보조스트림 | 사용 |
---|---|---|
FilterInputStream | FilterOutputStream | 필터를 이용한 입출력 |
BufferedInputStream | BufferedOutputStream | 버퍼를 통한 입출력 |
DataInputStream | DataOutputStream | 기본 단위로 데이터 처리 |
X | PrintStream | print,printf,println 사용 |
16bit의 문자나 문자열을 읽고 쓰는 스트림
자바에서 사용하는 char 형 변수는 2byte이므로 바이트 기반 스트림은 불편하므로 문자 단위로 입출력을 다루는 문자 기반 스트림을 제공
Reader | Writer |
---|---|
int read() | void write(inc c) |
int read(char[] cbuf) | void write(char []cbuf) |
abstrct int read(char [] cbuf, int off, int len) | abstract void write(char [] cbuf, int off, int len) |
abstrct int read(char [] cbuf, int off, int len) | void write(String str) |
abstrct int read(char [] cbuf, int off, int len) | void write(String str, int off, int len) |
입력 스트림 | 출력 스트림 | 대상 |
---|---|---|
FileReader | FileWriter | 파일 |
PipedReader | PipedWriter | 메모리 |
CharArrayReader | CharArrayWriter | 프로세스 |
문자 기반 스트림의 성능을 향상시키는 역할
입력 보조 스트림 | 출력 보조 스트림 | 대상 |
---|---|---|
FilterReader | FilterWriter | 필터를 이용한 문자 입출력 |
BufferedReader | BufferedWriter | 버퍼를 이용한 문자 입출력 |
입출력의 모든 메서드는 IOException이 발생할 가능성이 높으므로 예외 처리가 필요하다.
//패키지 내에 prac.txt 파일 미리 저장
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
public class Day02Ex {
public static void main(String[] args) {
//파일복사 프로그램
FileReader fr;
FileWriter fw;
BufferedReader br;
BufferedWriter bw;
try{
fr = new FileReader("prac.txt");
fw=new FileWriter("result.txt");
br=new BufferedReader(fr);
bw=new BufferedWriter(fw);
String line;
while((line = br.readLine()) != null){
bw.write(line);
}
bw.close();
br.close();
}
catch(Exception e) {
e.printStackTrace();
}
}
}
자바 시스템 내부에서 사용하는 개체나 데이터를 외부의 시스템에서 사용할 수 있도록 byte 단위의 데이터로 변환시키는 기술과 바이트로 변환된 데이터를 다시 객체로 변환하는 기술
1) 직렬화된 객체를 바이트 단위로 분해한다(marshalling)
2) 직렬화 되어 분해된 데이터를 순서에 따라 전송
3) 전송받은 데이터를 복구(unmarshalling)
데이터를 바이트 단위의 데이터로 변환시키는 작업
Serializable 인터페이스는 메서드없이 JVM에게 정보 전달 기능만 존재
객체 스트림을 통해 전달된 바이트 단위의 데이터를 원래의 객체로 복구하는 작업
주의할 점
어떤 객체 형태로 복구할 지 형 변환을 정확하게 명시
마샬링/언마샬링 예시
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class Day02Ex {
public static void main(String[] args) {
marshalling();
unmarshalling();
}
public static void marshalling() {
try {
FileOutputStream fos = new FileOutputStream("user.ser");
BufferedOutputStream bos = new BufferedOutputStream(fos);
ObjectOutputStream out = new ObjectOutputStream(bos);
User user1 = new User("test","1234","가길동");
out.writeObject(user1);
out.close();
System.out.println("객체 직렬화 완료!");
}
catch(IOException e) {e.printStackTrace();
}
}
public static void unmarshalling() {
try {
FileInputStream fis = new FileInputStream("user.ser");
BufferedInputStream bis = new BufferedInputStream(fis);
ObjectInputStream in = new ObjectInputStream(bis);
User user2=(User)in.readObject();
System.out.println(user2.toString());
user2.toString();
in.close();
System.out.println("객체 복원 완료!");
}
catch(Exception e) {}
}
}
class User implements Serializable{
private String id;
private String pw;
private String name;
public User(String id, String pw, String name) {
this.id = id;
this.pw = pw;
this.name = name;
}
@Override
public String toString() {
return "User [id=" + id + ", pw=" + pw + ", name=" + name + "]";
}
}