보조스트림
- 스트림의 기능을 향상시키거나 새로운 기능을 추가하기 위해 사용
- 기반 스트림을 먼저 생성한 후 이를 이용하여 보조 스트림을 생성
- 보조스트림 함수 안에 주스트림 객체를 넣어야함!
✅ 종류
public void changeStream() {
// 1. InputStreamReader / OutputStreamWriter
//: byte 기반 스트림을 문자기반 스크림으로 변경
//FileInputStream fis = null;
//InputStreamReader isr = null;
// try width resource 구문
try(FileInputStream fis = new FileInputStream("test");
InputStreamReader isr = new InputStreamReader(fis);) {
// FileInputStream -> 주 스트림
// InputStreamReader -> 보조 스트림
// 보조스트림 함수 안에 주스트림 객체를 넣어야함!
//fis = new FileInputStream("end");
//isr = new InputStreamReader(fis);
int data = 0;
while((data = fis.read())!=-1) {
System.out.println((char)data);
}
}catch(IOException e) {
e.printStackTrace();
}
}
- 입출력 속도를 향상 시켜주는 클래스
public void bufferedSave() {
// 주스트림 fos를 부스트림 bos 안에다 넣음
try (FileOutputStream fos = new FileOutputStream("myfile");
BufferedOutputStream bos = new BufferedOutputStream(fos);) {
String data = "오늘 너무너무 고마워요 눈ㅁ눌이 날뻔했어요";
bos.write(data.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
public void bufferedLoad() {
try (FileInputStream fis = new FileInputStream("myfile");
BufferedInputStream bis = new BufferedInputStream(fis);
InputStreamReader reader = new InputStreamReader(bis);) {
// InputStreamReader : 문자변환 보조 스트림
int data = 0;
while ((data = bis.read()) != -1) {
System.out.println((char) data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
- 자료형 기반으로 데이터를 저장하고 불러오기
// 메인문
Person[] persons = new Person[10];
persons[0] = new Person("유병승",19,'남',180.5,"경기도 시흥시");
persons[1] = new Person("강민기",32,'남',180.5,"경기도 안산시");
persons[2] = new Person("최솔",29,'여',164.3,"경기도 안양시");
persons[3] = new Person("윤지환",25,'남',180.1,"경기도 시흥시");
new SubStreamController().savePersons(persons);
Person[] result = new SubStreamController().loadPerson();
for(Person p : result) {
System.out.println(p);
}
// savePersons 클래스
public void savePersons(Person[] persons) {
// FileOutputStream 주 스트림
// DataOutputStream 보조 스트림
try(DataOutputStream dos =
new DataOutputStream(new FileOutputStream("persons"))){
for(Person p : persons) { // 객체안의 모든 값들을 파일로 적어줌
if(p!=null) { // 객체배열은 10칸인데 선언은 3명만해놓아서 널포인터 오류 예외처리
dos.writeUTF(p.getName()); // UTF -> String
dos.writeInt(p.getAge());
dos.writeChar(p.getGender());
dos.writeDouble(p.getHeight());
dos.writeUTF(p.getAddress());
}
}
}catch(IOException e) {
e.printStackTrace();
}
}
public Person[] loadPerson() {
Person[] result = new Person[10];
try(DataInputStream dis =
new DataInputStream(new FileInputStream("persons"))){
for(int i=0; i<result.length; i++) {
String name = dis.readUTF();
int age = dis.readInt();
char gender = dis.readChar();
double height = dis.readDouble();
String address = dis.readUTF();
Person p = new Person(name,age,gender,height,address);
result[i] = p;
}
}catch(EOFException e) {
System.out.println("저장된 데이터를 모두 불러왔습니다.");
}
catch(IOException e) {
e.printStackTrace();
}
return result;
}
- 파일에 객체형식으로 저장하고 가져오는 방법
- 객체기반으로 파일에 저장할 때 직렬화, 역직렬화를 해야한다.
- 직렬화, 역직렬화는 jvm이 알아서 처리 -> Serializerable인 인터페이스를 구현
public void objcetSave() {
try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("objfile"))){
oos.writeObject(new Person("유병승",19,'남',180.5,"경기도 시흥시"));
}catch(IOException e) {
e.printStackTrace();
}
}
public Person objectLoad() {
Person p = null;
try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream("objfile"))){
p = (Person)ois.readObject(); // 객체 타입으로 형변환 해줘야함
}catch(ClassNotFoundException | IOException e) {
e.printStackTrace();
}
return p;
}
//메인문
new SubStreamController().objcetSave(); // 값적고
Person p = new SubStreamController().objectLoad(); // 값 읽어서 반환
System.out.println(p);