1cm

자바 프로그래밍_Day_18_입출력(IO) 본문

국비지원_Java/Java Programming_1

자바 프로그래밍_Day_18_입출력(IO)

dev_1cm 2021. 9. 21. 16:47
반응형


2021.09.09

 



     > FileInputStream
       -> 파일로부터 바이트 단위를 읽을 때 사용하며, 그림, 오디오, 비디오, 텍스트 파일 등 모든 종류의 파일 읽기가 가능하다.

       -> InputStream의 하위 클래스로 InputStream과 사용 방법이 동일하다.
       -> 객체 생성

            -> FileInputStream객체가 생성될 때 파일과 직접 연결 된다. 만약 파일이 존재하지 않으면 FileNotFoundException이 발생하므로 예외처리가 필수다.



     > FileOutputStream
       -> 파일로부터 바이트 단위로 저장할 때 사용하며, 그림, 오디오, 비디오, 텍스트 파일 등 모든 종류의 데이터를 파일로 저장한다.

       -> OutputStream의 하위 클래스로 OutputStream과 사용 방법이 동일하다.
       -> 객체 생성

            -> FileOutputStream객체가 생성될 때 파일과 직접 연결 된다. 만약 파일이 존재하지 않으면 자동으로 생성하지만, 이미 파일이 존재하는 경우 파일을 덮어쓰는 단점이 있다.

위) mac / 아래) window

            -> 만약 기존 파일에 이어서 계속 작성하고 싶다면 아래 예제처럼 객체 생성 시 가능하다.

위) mac / 아래) window

 


     > FileReader

       -> 텍스트 파일로부터 문자 단위로 읽을 때 사용한다.(문자 기반의 입력 스트림)

       -> 텍스트가 아닌 그림, 오디오, 비디오 등의 파일은 읽기가 불가능하다.

       -> Reader의 하위 클래스로 Reader와 사용 방법이 동일하다.

       -> 객체 생성
            -> FileReader 객체가 생성될 때 파일과 직접 연결된다. 만약 파일이 존재하지 않으면 FileNotFoundException이 발생하므로 예외처리는 필수이다.

 

 


     > FileWriter

       -> 텍스트 파일로부터 문자 단위로 저장할 때 사용한다. (문자 기반의 출력 스트림)

       -> 텍스트가 아닌 그림, 오디오, 비디오 등의 파일은 저장이 불가능하다.

       -> Writer의 하위 클래스로 Writer와 사용 방법이 동일하다.

       -> 객체 생성
            -> FileWriter 객체가 생성될 때 파일과 직접 연결된다. 만약 파일이 존재하지 않으면 자동으로 생성하지만, 이미 파일이 존재하는 경우 파일을 덮어쓰는 단점이 있다.

            -> 만약 기존 파일에 이어서 계속 작성하고 싶다면 아래 예제처럼 객체 생성 시 가능하다.



     > 보조 스트림

       -> 스트림의 기능을 향상시키거나 새로운 기능을 추가하기 위해 사용한다.
       -> 보조 스트림은 실제 데이터를 주고 받는 스트림이 아니기 때문에 입출력 처리가 불가능 하기 때문에 기반 스트림을 먼저 생성한 후 이를 이용하여 보조 스트림을 생성해줘야 한다. (기반 스트림이 있어야 보조 스트림 생성 가능)


     > 보조 스트림 종류

       -> 문자 변환(InputStreamReader / OutputStreamWriter)
       -> 입출력 성능(BufferedInputStream / BufferedOutputStream)

       -> 기본 데이터 타입 출력(DataInputStream / DataOutputStream)

       -> 객체 입출력(ObjectInputStream / ObjectOutputStream) 등의 기능을 제공하는 보조 스트림이 있다.

보조 스트림 예시

 


     > 문자 변환 보조 스트림

       -> 소스 스트림이 바이트 기반 스트림이지만 데이터가 문자일 경우 사용한다.
       -> Reader와 Writer는 문자 단위로 입출력을 하기 때문에 데이터가 문자인 경우 바이트 기반 스트림보다 편리하게 사용이 가능하다. (변환해서 사용하겠다는 뜻)

       -> InputStreamReader

       -> OutputStreamReader


     > 성능 향상 보조 스트림 (Buffered InputStream/Reader | OutputStream/Writer)

       -> 느린 속도로 인해 입출력 성능에 영향을 미치는 입출력 소스를 이용하는 경우 사용한다.
       -> 입출력 소스와 직접 작업하지 않고 버퍼에 데이터를 모아 한꺼번에 작업을 하여 실행 성능이 향상된다.(입출력 회수 줄임)
       -> 필터 클래스 중 버퍼(Queue 구조로 되어있는 임시 저장소)를 제공하는 클래스, 프로그램하고 실제로 입출력하게 되는 소스들을 메모리 버퍼를 통해 미리 읽어놓고, 한번에 입출력하게 된다. 출력하게 될 시 버퍼가 다 차지 않는 경우도 있기 때문에 flush()메소드를 호출해 수동으로 잔류 데이터들을 내보내 줄 수 있게 끔 해주기도 한다.

 

 

 

     > 기본 타입 입출력 보조 스트림

       -> 기본 자료형 별 데이터 읽고 쓰기가 가능하도록 기능을 제공해준다. 단, 입력된 자료형의 순서와 출력될 자료형의 순서가 일치해야 한다. (자료형마다 저장되는 크기가 다르기 때문)

DataInputStream DataOutputStream
리턴 타입 메소드 리턴 타입 메소드
boolean readBoolean() void writeBoolean(Boolean v)
byte readByte() void writeByte(int v)
char readChar() void writeChar(int v)
couble readDouble() void writeDouble(double v)
float readFloat() void writeFloat(float v)
int readInt() void writeInt(int v)
long readLong() void writeLong(long v)
short readShort() void writeShort(short v)
String readUTF() void writeUTF(String str)



     > 객체 입출력 보조 스트림

       -> 객체를 파일 또는 네트워크로 입출력 할 수 있는 기능을 제공해준다. 단, 객체는 문자가 아니므로 바이트 기반 스트림으로 데이터를 변경해주는 직렬화가 필수이다.



     > 직렬화와 역직렬화
       -> 직렬화

            -> Serializable 인터페이스를 implements하여 구현한다.

            -> 객체 직렬화 시 private 필드를 포함한 모든 필드를 바이트로 변환하지만 transient 키워드를 사용한 필드는 직렬화에서 제외한다.

            -> 객체를 출력하기 위해서 필드의 값들을 일렬로 늘어선 연속적인 바이트형태로 변경해주는 방식


       -> 역직렬화

            -> 직렬화된 객체를 역직렬화할 때는 직렬화 했을 때와 같은 클래스를 사용한다. 단, 클래스 이름이 같더라도 클래스 내용이 변경된 경우 역직렬화에 실패한다.

            -> 파일에 저장되있거나 네트워크로 전송된 데이터들을 객체 형태로 변환해 메모리에 객체 형태로 넣어주는 작업

 


       -> serialVersionUID 필드

            -> 직렬화한 클래스와 같은 클래스임을 알려주는 식별자 역할로 컴파일 시 JVM이 자동으로 serialVersionUID 정적 필드를 추가해줘서 별도로 작성하지 않아도 오류는 나지 않지만 자동 생성 시 역직렬화에서 예상하지 못한 InvalidClassException을 유발할 수 있기 때문에 명시를 권장한다. (컴파일 될 때마다 다른 값이 들어갈 수 있음)

 

 

 

     > 입출력(IO) 코드 실습과 출력 결과

 

 

     > chap2.FileByteStream

fileSave
fileRead

       -> a_byte.dat 파일이 생성되고, 그 안에 fileSave에서 작성했던 코드들이 출력되는 것을 확인할 수 있었다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

     > chap2.Application

 

 

 

 

     > chap2.FileCharStream

 

 

     > chap2.Application

 

 

       -> b_char파일 생성 -> 데이터 입력확인

 

 

 

 

 

 

 

 

 

 

 

 

 

     > chap3.A_BufferedStream

 

 

 

 

     > chap3.A_BufferedStream.Application

 

 

 

     > chap3.B_ByteToCharStream

 

 

 

 

     > chap3.Application

 

 

     > chap3.C_DataStream

 

 

     > d_data

 

 

 

     > chap3.Member

 

 

     > chap3.D_ObjectStream

 

 

 

     > chap3.Application

 

 

     > e_object

 

 

 

 

반응형
Comments