본문 바로가기
Java

[Advanced JAVA] 데이터 I/O

by 루에 2014. 12. 27.
반응형

Java의 데이터 입출력 과정




'A'의 코드 값(유일)

'가'의 코드 값(나라마다 다르다. 코드 값이 10이라고 가정하면, 일본에서의 코드 값 10은 일본어가 나온다. 이러한 것들을 인코딩이라고 한다)

문자 세트, 문자 인코딩의 종류 및 이름

ISO-8859_1 

서유럽 

EUC-KR(KSC5601) 

KSC 5601-1987 문자세트에 대한 표준 인코딩 

ISO-2022-KR 

KSC-5601-1987 문자세트에 대한 표준 메일 인코딩 

Unicode 

유니코드 2.0 

UTF8 

표준 UTF-8 











UTF(Unified Text Format) : 전세계 모든 언어를 표현할 수 있는 문자셋

한글을 UTF8로 변환할 경우 한 글자에 3바이트 글자가 된다


Unicode L 유니코드 문자세트/16비트 인코딩

공식 이름 : Unicode2.0, UTF(Universal Charactor Set Transformation Format)-16

국제 표준 문자세트/16비트 인코딩

목적

통합 문자세트 및 인코딩

다양한 기존 문자세트 및 인코딩의 처리

효율성과 편리성



유니코드와 외부 문자 인코딩과의 변환 메소드

  • new String(byte[] bytes, int start=0, int length=this.length(), String encoding=디폴트 인코딩)
  • String 클래스의 byte[] getBytes(String encoding=디폴트 인코딩)
  • new InputStreamReader(inputStream in, String encoding=디폴트인코딩)
  • new OutputStreamWriter(OutputStream out, String encoding=디폴트 인코딩)
  • ByteArrayOutputStream의 toString(String encoding=디폴트 인코딩)
  • new PrintWriter(OutputStream out, boolean autoflush=false)
  • FileReader, FileWriter 클래스


스트림 입출력 클래스의 종류

스트림의 종류

입출력에 따른 스트림

입력 : InputStream, Reader

출력 : OutputStream, Writer

자료 타입에 따른 스트림

Byte Stream : InputStream, OutputStream

Character Stream : Reader, Writer

스트림의 생성에 따른

1차 스트림 : 파일, 메모리에 직접 Stream을 생성 : FileInputStream, FileWriter

Wrapper Stream(보조 스트림) : 이미 생성된 스트림에 추가 기능 제공 : InputStreamReader, BufferWriter


입출력 소스에 따른 스트림

파일

메모리

네트워크

다른 프로세스 또는 쓰레드





표준 입출력 스트림

java.lang.System 클래스에 선언 되어 있다

public class System {

public static PrintStream out;

public static InputStream in;

public static PrintStream err;

}


입력하기

int data = System.in.read();

출력하기

System.out.println("");


바이트 배열 쓰기

바이트 단위보다 더 큰 단위로 데이터를 쓰는 것이 빠른 경우가 있다

public void write(byte[] data) throws IOException

public void write(byte[] data, int offset, int length) throws IOException


출력 스트림의 flushing과 닫기

데이터는 버퍼에 일정 량이 쌓이면 내보내고 채운다. 하지만 flush() 메소드는 강제로 밀어내도록 하는 메소드이다


버퍼링을 이용한 데이터 읽기

연속적인 데이터를 byte 배열로 읽어들이는 read() 메소드를 제공한다

public int read(byte[] data)

public int read(byte[] data, int offset, int length)

offset위치에서 length만큼 바이트 데이터를 읽어 배열 형태의 버퍼에 저장하도록 되어 있다


입력 자료가 없으면 -1을 반환한다


 FileInputStream / FileOutputStream

입출력을 하기 위해 파일에 직접 읽고 쓰는 스트림이다. 파일의 위치를 다루는 class이다

실제 프로그래밍에서 많이 사용되는 스트림 중 하나이다


FileInputStream(String name) : 지정된 파일 이름을 가진 실제 파일과 연결된 스트림을 생성

FileOutputStream(String name) : 지정된 파일 이름을 가진 실제 파일과 연결된 스트림 생성. 파일이 없을 경우 생성


스트림으로부터 읽어올 수 있는 바이트 계산

      • 데이터를 읽기 전에 얼마나 바이트를 읽ㅇ르 수 있는지 미리 알고자 하는 경우가 있다. read()는 기본적으로 읽을 데이터가 없을 경우 블록 되어지는데, 블록 되어지는 상황을 막고자 할 때 주로 사용된다
      • InputStream 클래스의 available() 메소드는 입력 소스로부터 블럭킹되지 않고 얼마만큼 데이터를 읽어올 수 있는지 알려주는 기능을 한다. 만약 읽어 들일 데이터가 없는 경우 0을 리턴한다(네트워크에서는 0이 리턴되어도 데이터가 있을 수 있다)
바이트 데이터 건너 뛰기
      • 자바에서는 어느 정도 바이트를 건너 뛸 수 있는 skip() 메소드를 제공한다
      • 인자로 주어지는 long 타입의 인자 수만큼 바이트를 건너뛸 수 있다
      • 스킵은 읽고 난 뒤 필요없는 데이터를 버리는 방법보다 속도가 빠르다

Marking and Reseting
      • 데이터를 다시 이전으로 돌아가서 이미 읽었던 바이트를 읽어야 할 경우 mark를 통해 위치를 지정하고 Reset을 통해 마킹해둔 위치로 돌아갈 수 있다
      • 이러한 기능은 항상 가능한 것이 아니며 markSupported() 메소드를 이용해 사용 가능 여부를 알 수 있다


Searialization (직렬화)
  • 객체를 데이터 스트림을 만드는 것
  • 객체를 저장하거나 전송하기 위해 객체를 연속적인(serial) 데이터로 변환하는 것이다
  • 반대로 읽어들이는 것을 역직렬화(Deserialization) 이라고 한다
  • 객체의 인스턴스 변수를 저장하고, 이를 다시 읽어들이면 객체를 복원할 수 있다
  • ObjectInputStream과 ObjectOutputStream을 사용한다
  • 보조 스트림이므로 실제 직렬화 작업을 수행할 대상 스트림(파일, 메모리, 네트워크) 등을 생성자의 파라미터로 지정한다



반응형

댓글