Joslynn의 하루

대용량 웹서비스를 위한 MSA Full-Stack 개발자 양성 과정 -17일차 노트 필기_IOStream / 문자 기준 데이터 입출력/ Reader, Writer_220812 본문

MSA Full-Stack 개발자 양성과정/Java

대용량 웹서비스를 위한 MSA Full-Stack 개발자 양성 과정 -17일차 노트 필기_IOStream / 문자 기준 데이터 입출력/ Reader, Writer_220812

Joslynn 2022. 8. 12. 16:14

Exception 예외 -  자동 리소스 닫기

	// 괄호 안에 선언된 변수에 예외 발생시 자동으로 리소스 닫기(close()) 실행
    try(변수 선언...){
	
    } catch (Exception e){
    
    }

 


 

문자 단위로 파일 읽기 - File Reader → Buffered 이용 - BufferedReader

문자 단위로 파일 쓰기 = FileWriter →  Buffered 이용 - BufferedWriter

 

 

FileReader의 메소드

: read() → 한 문자를 기준으로 데이터를 읽음

: char 타입의 배열을 인수로 받음

BufferedReader의 메소드

: readLine() // 한 문장 단위로 데이터를 읽음, 데이터를 끝까지 다 읽으면 null을 반환

 

Writer의 메소드

: write() // 문자열을 바로 인수로 집어넣을 수 있음

 


모니터 출력: System.out

키보드입력: System.in

기존 방법:

InputStream is = System.in;
is.read(); // 1byte 읽기
// byte 단위를 문자 단위로 변환 필요하다! --- 보조 Stream이 필요
// InputStream ----> Reader ======> InputStreamReader (byte 단위를 문자 단위로 변환) 
  InputStreamReader ir = new InputStreamReader(System.in);
  ir.read(); // 1문자 읽기
  
 // Reader ----> Buffered 이용 ======> BufferedReader 
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  br. readLine(); // 한줄 읽기

개선 결과: Scanner 객체 // Scanner만 생성하면 내부에서 알아서 위 작업 완료

Scanner sc = new Scanner(System.in);
sc.nextLine();

 


 

데이터 저장

1) 변수: 한 가지 타입에 한 가지 값만 저장

              단점: 유형이 비슷한 여러 개의 값을 저장할 수 없음

2) 배열: 한 가지 타입에 index를 구분해서 여러 개의 값을 저장

              단점: 데이터 조작 불편

3) 자료구조: 여러 가지 타입을 다양하게 저장

                     데이터 조작도 용이

그러나 1, 2, 3번은 영속성이 제한적임 

프로그램이 종료되면, 데이터가 초기화됨

 

**필요한 정보를 지속적으로 저장할 수는 없을까?

: 결국 IO가 필요 - 파일에 저장 (삭제 전까지는 유지됨)

ex) ~.txt 

영희.txt → 나이:주소:연락처:...

split(":");으로 배열로 만들어 일일이 데이터를 꺼내야 함

 속성별 분리가 어려움

:하지만, 이 또한 방대한 양의 데이터를 저장하기에는 어려움이 있다.

 

ex) properties 파일 저장

key=value

age=20

name=영희

addr=서울

...

 

**자바의 입장에서 보면 정보를 객체로 저장한다.

class Student{

      name, age, addr

}

 

List <Student> list;

 

: 이처럼, 객체를 파일에 저장할 수 있다면 정보의 영속성을 유지할 수 있다.

: 이러한 부분을 자바에서 가능하도록 만들어 놓음; 

: 객체를 그냥 파일에 저장할 수 는 없음, => 객체를 직렬화해서 저장

: 저장하려고 하는 객체를 바이트 바이너리로 일렬로 늘어뜨려서 저장

  보조Stream (바이트 단위에서만 처리 가능)]'

: 저장된 파일의 내용을 읽을 때, 역직렬화를 해서 읽음;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;

public class ObjectSaveExam {
	
	public ObjectSaveExam(){
		//저장할 객체를 생성
		List <Student> list = new ArrayList<Student>();
		list.add(new Student("원영", 23, "여수"));
		list.add(new Student("소희", 15, "성남"));	
		list.add(new Student("준형", 28, "부산"));
		
		// 객체를 파일에 저장
		try(ObjectOutputStream ops = new ObjectOutputStream(
				new FileOutputStream("/**파일 경로*/"))) {
			ops.writeObject(list);
            
		} catch (Exception e) {
			e.printStackTrace();
		}
        
	}
	
	public static void main(String[] args) {
		new ObjectSaveExam();
	}

}
Comments