728x90
BufferedReader / BufferedWriter
=> 버퍼공간을 제공해서 한번에 모아뒀다가 한꺼번에 입출력 진행
=> 속도 향상 목적의 보조 스트림 (BufferedXXX)
보조스트림클래스이름 객체이름 = new 보조스트림클래스이름(기반스트림객체);
=> 보조스트림은 단독으로 존재할 수 없기 때문
try ~ with ~ resource 구문
- JDK7 버전 이상부터 가능
try(스트림객체생성;){
예외가 발생할법한 구문
} catch(예외클래스이름 e){
해당 예외가 발생했을 때 실행할 구문
}
- 스트림객체를 try에 넣어버리면
스트림객체를 생성 후 해당 블록의 구문이 실행 완료되면
알아서 자원 반납이 된다.
- 선언부분도 같이!
- 객체 생성을 여러개 할 경우 마지막 생성부는 ; 붙여되고
안붙여도 된다.
728x90
public class BufferedDao {
// 프로그램 --> 외부매체(파일)
// 출력
public void fileSave() {
// BufferedWriter : 버퍼공간을 제공해서 한꺼번에 출력을 진행하겠다.
// 기반스트림이 Input/Output 계열일 경우
// 보조스트림도 Input/Output 계열을 사용
// 기반스트림이 Reader/Writer 계열일 경우
// 보조스트림도 Reader/Writer 계열을 사용
/*
FileWriter fw = null;
BufferedWriter bw = null;
try {
// 1. 기반스트림 객체 생성 = > 연결통로를 만들겠다.
fw = new FileWriter("c_buffer.txt");
// 2. 보조스트림 객체 생성
bw = new BufferedWriter(fw);
//bw = new BufferedWriter
//(new FileWriter("c_buffer.txt"));
*/
/*
// 3. 파일에 쓰기 => write()
bw.write("안녕하세요");
bw.newLine();
bw.write("반갑습니다\n");
bw.write("잘가세요~");
} catch (IOException e) {
e.printStackTrace();
} finally {
// 4. 자원반납 => close()
try {
bw.close();
fw.close(); // 자원 반납 시에는 생성된 자원 순서의
// 역순으로 반납한다.
} catch (IOException e) {
e.printStackTrace();
}
}
*/
// 프로그램 <---- 파일
// 입력
/*
public void fileRead() {
// FileReader기반으로 BufferedReader를 추가해서 쓰겠다.
FileReader fr = null;
BufferedReader br = null;
try {
// 1. 기반스트림 객체 생성
fr = new FileReader("c_buffer.txt");
// 2. 보조스트림 객체 생성
br = new BufferedReader(fr);
// 3. 읽어오기 -> read()
//System.out.println(br.read());
/*
System.out.println(br.readLine());
System.out.println(br.readLine());
System.out.println(br.readLine());
System.out.println(br.readLine()); // null
*/
/*
String value = null;
while((value = br.readLine()) != null) {
System.out.println(value);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 4. 자원반납 => close()
// 왜 close 안해도 될까?
// 언제 어디서 문제가 발생할지 모른다.
// 원칙에 따라서 close를 해주는것이 좋다.
try {
br.close();
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
*/
/*
try(FileReader fr = new FileReader("c_buffer.txt");
BufferedReader br = new BufferedReader(fr))*/
try(BufferedReader br = new BufferedReader
(new FileReader("c_buffer.txt"))){
/*
String value = "";
while((value = br.readLine()) != null) {
System.out.println(value);
}
*/
String s = br.lines().collect(Collectors.joining("\n"));
System.out.println(s);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
FileInputStream : 기반스트림
ObjectInputStream : 객체 단위로 파일로부터 읽어올 때 사용하는 보조스트림
public class ObjectDao {
// 프로그램 --> 외부대체(파일)
// 출력
// ObjectOutputStream : 객체단위를 파일에 출력하고자 할 때 필요한 보조스트림
public void fileSave(String fileName) { // 파일 이름을 입력받아서 지정해보자
Phone ph = new Phone("아이폰","13mini", "apple",950000);
// 1단계. 기반스트림 => FileOuputStream
// 2단계 .보조스트림 => ObjectOutPutStream
// 4단계. 자원반납 => close()
try(ObjectOutputStream oos
= new ObjectOutputStream(new FileOutputStream(fileName))){
// 3단계. 객체 데이터를 파일에 출력해보자
oos.writeObject(ph);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// 객체를 파일로 출력했더니 깨져서 exception 어쩌고 나옴 => 직렬화
// 파일을 출력! 뭔가 괴상망측한 데이터가 나온다
// 잘 담겼나 확인해보려면 다시 입력해보면 되지 않을까?
// 프로그램 <-- 외부매체
// 입력
public void fileRead(String fileName) {
FileInputStream fin = null;
ObjectInputStream ois = null;
try { // 내가 뭔가 실행할 코드 얘는 이제 예외가 발생할 수도 있고 안 발생할 수도 있음
// 1. 기반스트림 생성
fin = new FileInputStream(fileName);
// 2. 보조스트림 생성
ois = new ObjectInputStream(fin);
// 3. 읽어오기 readObject()
// 역직렬화는 readObject()가 알아서 해줌
Phone ph = (Phone)ois.readObject();
// Object 클래스가 Phone 클래스의 부모클래스
System.out.println(ph);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
//4. 자원반납
try {
fin.close();
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
728x90