Programming/JAVA

[JAVA] BufferedReader / BufferedWriter / try ~ with ~ resource / FileOuputStream / ObjectOutPutStream

Jayna. 2024. 1. 12. 10:43
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