▶ 보조 스트림
- 기반 스트림(외부매체와의 직접적인 연결이 목적)의 부족한 기능들을 확장시킬 수 있는 스트림
- 보조 스트림은 단독으로 사용이 불가능하다. (단독으로 객체 생성 자체가 안된다.)
[표현법]
보조스트림 변수명 = new 보조스트림(new 기반스트림(외부매체경로));
■ Buffered
- 속도 성능 향상 목적의 보조 스트림
- 버퍼 공간을 제공해서 데이터를 한 번에 모아뒀다가 한꺼번에 입출력 진행
■ Object
- 객체 단위로 입출력 목적의 보조 스트림
■ Data
- 자료형 단위로 입출력 목적의 보조 스트림
▶ Buffered
■ BufferedReader / BufferedWriter
기반스트림 객체 먼저 생성(FileWriter)
보조스트림도 Reader/Writer 계열이면 기반스트림도 Reader/Writer 계열이 여야 한다.
보조스트림도 Input/Output 계열이면 기반스트림도 Input/Output 계열이여야한다.
■ 출력해보기 (프로그램 => 외부매체(파일))
public void fileSave() {
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new FileWriter("c_buffer.txt"));
bw.write("안녕하세요");
bw.newLine(); // 개행을 넣어주는 메서드
bw.write("반갑다\n");
bw.write("수고하셨어요");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
■ 입력해보기 (프로그램 <= 외부매체(파일))
public void fileRead() {
try (BufferedReader br = new BufferedReader(new FileReader("c_buffer.txt"))) {
String value = null;
while ((value = br.readLine()) != null) {
System.out.println(value);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
● try ~ with ~ resource구문 (JDK 7 버전 이상부터만 가능)
[표현법]
try (스트림객체 생성;) {
// 예외가 발생될법한 구문
} catch (예외클래스명 e) {
// 예외 발생시 실행할 구문
}
스트림객체를 try(여기) 안에 넣어버리면 스트림 객체 생성 후 해당 블록구문이 실행 완료된 후, 알아서 자원이 반납된다.
▶ Object
■ Serializable
- 직렬화할 수 있는 인터페이스(Serializable)
- 객체단위로 입출력해 주는 스트림에서 사용될 객체는 반드시 "Serializable"을 구현해야 한다. 그렇지 않으면 NotSerializableException이 발생한다.
■ transient
[표현법]
접근제한자 transient 자료형 변수;
transient 객체입출력스트림에서 해당값을 전송하지 않는다.
■ 객체단위를 파일에 출력해보기 (프로그램 => 외부매체(파일))
FileOutputStream : 파일에 데이터를 출력하는 "기반"스트림
ObjectOutputStream : 객체단위로 출력을 보조해 주는 보조스트림
1. phone 클래스 생성
public class Phone implements Serializable {
private String name;
private int price;
public Phone() {
}
public Phone(String name, int price) {
super();
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
2. ObjectOutputStream를 이용해서 출력하기
public void fileSave(String fileName) {
// 길이 3 객체배열 선언
Phone[] arr = new Phone[3];
arr[0] = new Phone("아이폰", 15000000);
arr[1] = new Phone("삼성", 10000000);
arr[2] = new Phone("LG", 7000000);
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName))) {
for (int i = 0; i < arr.length; i++) {
oos.writeObject(arr[i]);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
■ 객체단위를 파일에 입력해보기 (프로그램 <= 외부매체(파일))
FileInputStream : 파일로부터 데이터를 읽어 들이기 위해 사용되는 기반스트림
ObjectInputStream : 스트림으로부터 객체 단위로 입력받기 위해 사용되는 보조스트림
ObjectInputStream를 이용해서 입력하기
public void fileRead() {
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("phone.txt"))) {
while (true) {
Phone p = (Phone)ois.readObject();
System.out.println(p);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (EOFException e) { // End Of File의 약자, IOException의 부모이기 때문에 다형성에 걸린다.
System.out.println("파일을 다 읽었네요.");
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
▶ Data
■ 데이터를 파일에 출력해보기 (프로그램 => 외부매체(파일))
public void fileSave() {
try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("d_data.txt"))) {
// 자바 자료형별로 작성이 가능하다.
dos.writeBoolean(true);
dos.writeInt(300);
dos.writeDouble(5.0);
dos.writeChar('하');
dos.writeChar('2');
dos.writeUTF("자바~~");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
■ 데이터를 파일에 입력해보기 (프로그램 <= 외부매체(파일))
public void fileRead() {
try (DataInputStream dis = new DataInputStream(new FileInputStream("d_data.txt"))) {
// 반드시 씌여진 자료형 순서대로 읽어올 것
System.out.println(dis.readBoolean());
System.out.println(dis.readInt());
System.out.println(dis.readDouble());
System.out.println(dis.readChar());
System.out.println(dis.readChar());
System.out.println(dis.readUTF());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
'JAVA' 카테고리의 다른 글
JAVA (29) 제네릭(Generic) (0) | 2023.04.19 |
---|---|
JAVA (28) Collection (0) | 2023.04.15 |
JAVA (26) FileCharDao (0) | 2023.04.15 |
JAVA (25) FileByteDao (0) | 2023.04.13 |
JAVA (24) 스트림 (0) | 2023.04.13 |