프로그램이 출발지냐 또는 도착지냐에 따라 스트림 종류가 결정됨
스트림은 단방향이므로 하나의 스트림으로 입력과 출력을 모두 할 수 없음
입력 스트림
출력 스트림
자바의 기본적인 데이터 입출력 API는 java.io 패키지에서 제공
java.io패키지에는 파일 시스템의 정보를 얻기 위한 File 클래스와 데이터를 입출력하기 위한 다양한 입출력 스트림 클래스를 제공
스트림 클래스는 크게 바이트 기반 스트림과 문자 기반 스트림으로 구분
InputStream 클래스 상속 관계도
OutputStream 클래스 상속 관계도
Reader 클래스 상속 관계도
Writer 클래스 상속 관계도
스트림
이용File file = new File(path + "file.txt");
exists()
메소드를 호출할 수 있음true
를 리턴하고 존재하지 않는다면 false
리턴// 문자열로 된 파일의 경로를 가지고 FileInputStream을 생성하는 경우
FileInputStream fis = new FileInputStream(path + "dog.jpg");
// 저장할 파일이 File객체로 생성되어 있는 경우 더 쉽게 생성 가능
File file = new File(path + "dog.jpg");
FileInputStream fis = new FileInputStream(file);
// 문자열로 된 파일의 경로를 가지고 FileInputStream을 생성하는 경우
FileOutputStream fos = new FileOutputStream(path + "dog.jpg", true);
// 저장할 파일이 File객체로 생성되어 있는 경우 더 쉽게 생성 가능
File file = new File(path + "dog.jpg");
FileOutputStream fos = new FileOutputStream(file, true);
FileOutputStream
생성자 두 번째 매개값을 true
InputStream
, FileInputStream
, Reader
, FileReader
연결OutputStream
, FileOutputStream
, Writer
, FileWriter
연결보조스트림 변수 = new 보조스트림(연결스트림)
InputStream is = System.in;
InputStreamReader reader = new InputStreamReader(is);
InputStream is = System.in;
InputStreamReader reader = new InputStreamReader(is);
BufferedReader br = new BufferedReader(reader);
** 바이트 입력 스트림에 연결되어 문자 입력 스트림인 Reader로 변환시키는 보조 스트림 **
Reader reader = new InputStreamReader(바이트입력스트림);
** 콘솔 입력을 위한 InputStream을 다음과 같이 Reader 타입으로 변환할 수 있음 **
InputStream is = System.in;
Reader reader = new InputStreamReader(is);
** 파일 입력을 위한 FileInputStream도 다음과 같이 Reader 타입으로 변환시킬 수 있음 **
FileInputStream fis = new FileInputStream(path + "input.txt");
Reader reader = new InputStreamReader(fis);
/* `FileInputStream`에 `InputStreamReader`를 연결하지 않고 `FileReader`를 직접 생성가능
`FileReader`는 `InputStreamReader`의 하위 클래스이기 때문에 `FileReader`가 내부적으로
`FileInputStream`에 `InputStreamReader` 보조 스트림을 연결한 것이라고 볼 수 있음 */
BufferedInputStream
, BufferedOutputStream
이 있고,BufferedReader
, BufferedWriter
가 있다.Reader reader = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(reader);
String inputStre = br.readLine();
BufferedOutputStream bos = new BufferedOutputStream(바이트출력스트림);
BufferedWriter bw = new BufferedWriter(문자출력스트림);
DataInputStream
과 DataOutputStream
보조 스트림 연결하면 기본 데이터 타입으로 입출력 가능DataInputStream dis = new DataInputStream(바이트입력스트림);
DataOutputStream dos = new DataOutputStream(바이트출력스트림);
print()
, println()
메소드를 가지고 있는 보조 스트림print()
, println()
메소드를 사용할 수 있었음PrintStream
은 바이트 출력 스트림과 연결되고 PrintWriter()
는 문자 출력 스트림과 연결PrintStream
과 PrintWriter
는 거의 같은 기능을 가지고 있음PrintStream ps = new PrintStream(바이트출력스트림);
PrintWriter pw = new PrintWriter(문자출력스트림);
자바는 메모리에 생성된 객체를 파일 또는 네트워크로 출력할 수 있음
객체는 문자가 아니기 때문에 바이트 기반 스트림으로 출력해야 함
직렬화 (serialization)
역직렬화 (deserialization)
ObjectInputStream, ObjectOutputStream
ObjectInputStream
과 ObjectOutputStream
을 제공ObjectOutputStream
은 바이트 출력 스트림과 연결되어 객체를 직렬화하는 역할ObjectInputStream
은 바이트 입력 스트림과 연결되어 객체로 역직렬화하는 역할ObjectInputStream ois = new ObjectInputStream(바이트입력스트림);
ObjectOutputStream oos = new ObjectOutputStrema(바이트출력스트림);
직렬화가 가능한 클래스 (Serializable)
Serialzable
인터페이스를 구현한 클래스만 직렬화할 수 있도록 제한Serializable
인터페이스는 필드나 메소드가 없는 빈 인터페이스이지만 객체를 직렬화할 때 private
필드를 포함한 모든 필드를 바이트로 변환해도 좋다는 표시 역할을 함static
또는 transient
가 붙어 있을 경우에는 직렬화가 되지 않는다.public class XXX implements Serializable {
public int field1;
protected int field2;
int field3;
private int field4;
public static int field5; // 직렬화에서 제외
transient int field6; // 직렬화에서 제외
}