Java 기반 클라우드 융합 개발자 과정 - KH 정보교육원/5월

22. 05. 02 - 입출력(IO), 스트림(Stream), try with resource

giggs 2022. 5. 11. 10:08

 

Input Output – IO

 

  • 입출력은 – 대상이랑 프로그램을 연결해주는 통로!
  • 통로 만드는 것이랑 통로 사용방법만 알면 끝!
  • 파일을 대상으로 할 것이므로 파일에 대해 추가적으로 알아보기
  • 파일에다가 스트림 만들어주고 사용해보는 것으로 실습

 

 

 

이론 - 교재 먼저 학습

 

 

  • 스트림의 종류 너~~~무 많다.
  • 기본 베이스 스트림으로는 출력(Output) / 입력(Input) 스트림
  • 각각에 보조 스트림 존재
  • 보조 스트림은 통로를 더 잘 이용할 수 있도록 도와주는 역할
  • 보조 스트림은 혼자 사용 불가
  • ex) 바이트 단위로 데이터를 왔다 갔다 해줄지 - input / output Stream
  • ex) 문자를 단위로 데이터를 왔다 갔다 해줄지 - Reader / Writer Stream
  • ex) 읽고 처리하고 읽고 처리하고 바로바로 하기 힘드니까
  • ex) 어떤 바구니에 담아놓고 한 번에 처리하도록 해주기 - buffered

 

 

 

 

 

 

  • 통로는 한 가지 기능만! 
  • 입력 통로 출력 통로 각 1개씩 - 총 2개 필요

 

 

 

 

 

 


 

 

 

 

File 스트림 활용해서 IO스트림 실습 예정

  • java프로젝트 하나만 만들 것이므로 

 

 

 

 

디렉토리 ( == 폴더 )

  • 생성자 메소드는 외울 필요X, 이런 게 있다 알고 그때그때 찾아서 사용
  • 가장 많이 사용되는 입출력 대상
  • myTextDoc.txt 파일을 객체로 이용할 수 있게 해주는 것이다!
  • 내 컴퓨터에 있는 파일 자체를 우리 프로그램으로 가져올 수 있는 것

 

 

 


 

 

 

인풋/아웃풋 스트림 생성 시 - 인자 값으로 파일에 대한 정보 필요

 

 

 

 

  1. filePath – 경로를 넣어줘도 되고
  2. fileObj – 파일 객체를 넣어주는 경우도 있다.

 

 

 


 

 

보조 스트림

  • 근본은 input / output 스트림인데 – 이것을 확장 개념으로 사용을 도와주는 스트림들 존재

 

 

 

 

 

보조 스트림은 단독으로 사용할 수 없!다!

기존 스트림이 필요하다~ , 기존 스트림의 기능을 확장해서 사용하기 위해 쓰는

 

 

 

 


 

 

buffered 스트림

 

 

 

 

ex)BufferedInputStream  바구니  buffer에 문자열 꽉 채워서 한 번에 처리하는~

ex)Buffer없을때는 하나 받고 하나 처리하고 하던 것을 모아서 한 번에- 빠르다

 

 

 

 

 


 

 

 

 

 

 

자주 사용하는 것과 기본 구성만 숙지하면 된다!

 

 

 

실습 시작!

  • 스트림 다 외워서 사용하는 것은 X
  • 스트림에 이런 것이 있다. 알고, 필요할 때 검색해서 사용하기
  • 내 파일이랑 프로그램이랑 연결시켜주려면 어떤 스트림을 사용해야 할까?
  • 구글 java file inputstream 검색
  • 어떤 스트림 사용 가능한지 Find!

 

 

 

 


 

 

 

 

1. 파일에 있는 글씨 읽어오기 - FileReader() 사용

 

 

 

 

 

 

 

1. 파일 정보 얻기 ( 파일 객체 생성 

  • new File("파일 위치한 경로")

 

2. 파일이랑 연결하기 - 파일이랑 연결된 알맞은 스트림 선택하기 

  • 우리 프로그램으로 들어오는것이니까 인풋 스트림 + 파일을 읽어올 것이니까 파일
  • FileInputStream-- 1byte씩 처리하고, 읽어드리는 기본 단위가 숫자다. 이것 말고
  • FileIReader ------ 2byte씩 처리하고 읽어드리는 기본 단위가 문자 단위인 - Reader로 사용
  • new FileReader()의 인자 값으로 = 파일 객체 넣어주는 것 check!
  • 스트림 이용해서 데이터 전송할 것이다.

 

3. 파일 리더와 read() 메서드 부분에서 발생하는 예외 처리 

  • catch / add catch로 처리

 

4. 한 글자씩 읽어드리는 작업을 반복하도록 while 문으로 처리

  • read() 메소드는 읽어드리는 파일의 마지막일 때  –1 반환해준다 - Check!

 

5. 스트림을 사용했을 경우 반드시 반납 필요 

  • 예외가 나던 안 나던 무조건 실행하는 finally를 이용
  • 더 이상 자원을 낭비하지 않게 - 이 스트림을 닫아 줄 필요가 있다.
  • stream  -> 무조건 close 필요하다.
  • stream . close()상황에 예외 발생할 수 있다. - try/catch로 잡아주기

 

 

+@ finally를 따로 try / catch로 빼주지 않는 이유 :

  • 예상치 못한 예외 발생을 대비해서 finally를 사용해야 한다.
  • 예외 발생 시 - (따로 try/catch문에 있으면 실행 안됨 / finally에 있으면 실행됨 )

 

 

 

 

지금은 한 글자씩 읽어드리니까 오래 걸리고 불편하다

뒤에서는 바구니에 담아서 한 번에 읽어드리는 BufferedReader() 사용할 예정!

 

 

 

 

 


 

 

 

2. 파일에다가 글씨 쓰기 - FileWriter() 사용

 

 

 

 

 

1. 파일 정보 얻기 ( 파일 객체 생성)

  • path에 사용할 파일 경로를 넣어주고
  • new File(path) 식으로 이용!

 

2. 파일이랑 연결( 파일이랑 연결된 스트림 )

  • 스트림 이용해서 데이터 전송
  • 연결을 위해서 어떤 스트림을 사용할지? - FileWriter()

 

3. 예외처리  try/catch

  • str은 스캐너로 입력받은 값 ===> Scanner str = new Scanner(System.in); 
  • 스트림 사용했으면 반납필요 - finally에 .close (+ try/catch)
  • fw 변수의 선언 위치 변경 (+@ =null 로 초기화해주는 이유 = 지역 변수라서)

 

 

+@ flush() 의 느낌

  • 통로 안에 있는 ( 스트림 안에 있는 ) 애들을 쭉 위로(파일로) 밀어주는 느낌
  • 내가 프로그램에서 -> 파일로 보낼 때는 무조건 해주는 작업! flush

 

 

 

 


 

 

 

보조 스트림 활용해보기

  • 지금까지 우리가 한 것
  • 스트림을 이용해서 입력받는 것도 해보았고
  • 스트림을 이용해서 출력하는 것도 해보았다.
  • 일반 스트림을 이용해서 해본 것!
  • 보조 스트림 활용해보기!~

 

 

 


 

 

 

 

1. 보조 스트림 활용해서 입력받기 - BufferedReader()사용

 

  • BufferedReader : 문자열 처리할 거니까 Reader 쓸 거고, Buffer를 사용하고 싶음

 

 

 

 

 

 

 

 

1. 보조 스트림을 생성할 때는 그 기본이 되는 메인 스트림 필요

  • new BufferedReader() 를 생성할 때는 그 기본이 되는 Reader 스트림 필요 - 우리는 FileReader사용
  • new FileReader() 를 생성할 때는 그 기본이 되는 파일 객체 필요 - f 필요

 

 

 

2. while 조건문 체크

  • 버퍼드리더의 readLine() 메서드는 는 마지막까지 다 읽으면 null을 return 해준다.
  • +@ 파일 리더의 read() 메서드는  -1 반환이었음 

 

 

 

3. 정리

  • 파일 읽어올 것이다 – input
  • 2byte씩 문자열 처리할 것이다 – Reader
  • 파일을 이용해서 작업할 것이다. - FileReader
  • 버퍼 도구를 사용할 것이다. - Buffer
  • BufferedReader()

 

 

+@ 

  • > FileReader 예외 처리 –try/catch
  • > finally – br.close(); 필요
  • > br 변수 안보임 – 선언 위치 변경 – 초기화 필요
  • > finally br.close – try/catch 필요

 

 

 

 


 

 

 

2. try with resource

 

  • close() 작업을 – try/catch 말고 다른 방식으로 해보자
  • 매번 똑같은 작업 해주는 것 힘들다. 귀찮다.
  • try with resource 기능을 이용하자!

 

 

 

 

 

 

사용 방법

  • 한 번 쓰고 close 할애를 – 한 번 사용하고 말애를
  • try ( ) 소괄호 안에다가 넣어주면 된다!
  • addCatch 뜨는 거 추가해준다 .IOException

 

 

 

 

 


 

 

 

 

 

3. java file append

 

 

파일에 입력 시 문제 발생 -

  • 파일에다가 데이터 계속 넣고 다시 실행하면 원래 데이터 없어짐..

 

 

 

 

해결 -

  • append 값에 true 입력해주기 
  • java file append 

 

 

 

  • java file 이어 쓰기 ==> 스트림 생성 시 boolean타입 인자 값으로 true 넣어 주기.   
  • boolean append = true 해주기  

 

 

 

 

 

 


 

 

 

 



review


실습을 하면서 중간중간 체크해 놓고 싶은 부분이 많았는데
다 올리려니 내용이 너무 길어져서 마무리된 코드를 가지고
체크하는 부분만을 골라서 포스팅했다.

복습하려고 보게 되면 꼭! 메모해놓은 한글파일도 같이 보도록!
( 나에게 하는 말 ㅎㅎ )

양이 많았다는 것은. 이 부분을 잘 모른다는 뜻!
스트림의 기본 개념과 어떻게 생성하고, 사용하는지
 기초를 알게 되었으니
혼자서 이것저것 사용해보고 더 찾아보고 하는
시간이 필요할 것 같다.

DB를 배워도 이런 식으로 파일을 읽어드리는 것을 사용할까?
DB 파일을 읽어드리는 건가?
찾아보자 ㅎㅎ