파일입출력 : stream

서현서현·2023년 8월 6일
0

JAVA

목록 보기
23/27
System.setIn(new FileInputStream("src/algo0823/input_1247.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

SWEA 문제를 푸는데 input이 보통 txt파일로 주어지더라..
이참에 미루고 미루던 버퍼리더를 사용해보자는 생각이 들어서 공부했다
앗 쉽다쉬워 파일입출력!!

I/O와 Stream

데이터는 한쪽에서 주고 한쪽에서 받는 구조로 되어있음. 따라서 두 노드를 연결해서 데이터를 전송할 수 있는 개념을 만들었는데 이를 스트림이라고 한다! 스트림은 단방향 통신만 지원하며 하나의 스트림으로 입출력을 둘 다 처리할 수는 없다.

Node Stream

스트림의 종류를 나눠보자면
1. 데이터 타입에 따라(byte or char) XXStream / XXer로 나뉘고
2. 방향에 따라(입력 or 출력) InputStream/OuputStream과 Reader/Writer 으로 나뉘고
3. 노드 타입에따라 키보드는 InputStream, 파일은 FileInputStream, .... 이런식으로 분류된다.
이름 보고 느낌만 알면 된다.

보조 스트림

  • File Stream, Processing Stream이 있다. 다른스트림에 부가적인 기능을 제공한다.

직렬화

객체를 직렬화 하여 파일로 저장하거나 불러올 수 있다. 네트워크로 전송할 수도 있다.

  • 직렬화 조건
  1. Serializable 인터페이스를 구현할것
  2. 클래스의 모든 멤버가 Serializable 인터페이스를 구현해야함
  3. 직렬화에서 제외하려는 멤버는 transient 선언
    (CF) SerialVersionUID 라는것이 있는데, 클래스 변경여부를 파악하기 위한 유일키이다. 직렬화할때 UID와 역직렬화할때 UID가 다르면 예외가 발생하므로 직렬화 되는 객체에 대해 설정을 권장한다.

객체를 파일로 저장하기 & 파일을 객체로 읽기

// 0. 직렬화를 통해 파일<->객체 가능하게 하기
class Animal implements Serializable {}

// 1. 파일이 없는상태에서 파일 쓰기
public void saveData() throws IOException {
	String src = "data.dat";
    FileOutputStream fos = new FileOutputStream(src);
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(animals); //animals는 List<Animal>이다
}

// 2. 어쩌고.dat 형태의 데이터파일을 읽어오는 메소드
private void loadData() throws IOException, ClassNotFoundException {
	String src = "data.dat";
    FileInputStream fis = new FileInputStream(src);
    ObjectInputStream ois = new ObjectInputStream(fis);
    Object obj = ois.readObject();
    Animals (List<Anumal>) obj;
}

0개의 댓글