[JAVA] 기초문법 - 파일입출력(2)


FileInputStream객체로 한글을 읽으면 깨짐 현상이 발생한다.
이것을 InputStreamReader 보조스트림으로 해결하는 방법은 다음과 같다.(문자로 변환)

FileInputStream을 InputStreamReader의 매개변수로 전달해서 객체생성.
Filereader객체로 읽으면 한글깨짐이 없지만. Sysyem.in와 같은 바이트만 읽는 객체를 문자로 변환하는 경우도 있기 때문에 제공되는 보조스트림인다.(소켓에서도 사용한다.)
버퍼링기능 제공하는 스트림
파일복사 예제(버퍼사용x) 걸리는 시간 체크


많은 시간이 걸리는 것을 알 수 있다.
버퍼사용 한 파일 복사-시간체크



버퍼 보조스트림을 사용해서 복사시간이 단축된것을 알 수 있다.
데이터의 자료형을 보존하면서 읽고 쓰는 기능을 제공하는 스트림(DataOutputStream,DataInputStream)




쓴 자료형을 보존하면서 그대로 읽어드린 모습이다.


데이터 말고 오브젝트를 읽고 쓰는 방법

사용법
클래스 선언

직렬화를 사용하기 위해서 Serializable인터페이스를 구현해야함.
객체 선언 후 정보를 파일에 저장.(ObjectOutputStream을 이용-직렬화)

파일 읽어보기(ObjectIntputStream)


정상적으로 출력된것을 볼 수 있다.
클래스 멤버변수에 traansient 키워드를 붙이면 직렬화 허용을 막을 수 있다.-null값으로 직렬화가 이루어진다.
Externalizable 인터페이스를 구현해서 write.obj나 read.obj가 불릴때 어떻게 작동할 것인지 사용자가 직접 정할 수도 있다.(두가지 메서드를 구현해야하는데, 읽고 쓰는 순서가 동일 해야 한다.)



RandomAccessFile 클래스-입출력 동시에 가능
파일포인터 위치를 활용

파일에 값을 write하고, 파일포인터 위치를 출력
파일포인터 위치를 맨앞으로 다시 옮겨주고(rf.seek(0))
순서대로 읽기 - 입출력 동시에 가능