[자바 기초] 입출력 IO

입출력

입출력 IO

입출력 정의

  • Input Out 약자
  • 컴퓨터 내부 또는 외부 장치와 프로그램 간 데이터를 주고 받는 것
  • 하드웨어 장치에 직접 접근이 필요
  • 입출력 데이터를 처리할 공통적 방법으로 스트림 이용

스트림 Stream

스트림 정의

  • 입출력 장치에서 데이터를 읽고 쓰기 위해 사용하는 자바에서 제공하는 클래스
  • 모든 스트림은 단방향 Simplex
  • 각각의 장치마다 연결할 수 있는 스트림이 존재
  • 하나의 스트림으로 입출력을 동시에 수행 불가능
  • 동시에 수행할 경우 2개의 스트림 사용

스트림 분류

  • 바이트 기반 스트림
    • 입력 바이트 스트림
      • 최상위 클래스 InputStream
      • 하위 클래스 … InputStream
    • 출력 바이트 스트림
      • 최상위 클래스 OutputStream
      • 하위 클래스 … OutputStream
  • 문자 스트림
    • 입력 문자 스트림
      • 최상위 클래스 Reader
      • 하위 클래스 … Reader
    • 출력 문자 스트림
      • 최상위 클래스 Writer
      • 하위 클래스 … Writer

스트림 종류

  • Reader
    • BufferedReader
      • LineNumberReader
    • CharArrayReader
    • InputStreamReader
      • FileReader
    • FilterReader
      • PushbackReader
    • PipedReader
    • StringReader
  • InputStream
    • FileInputStream
    • PipedInputStream
    • FilterInputStream
      • LineNumberInputStream
      • DataInputStream
      • BufferedInputStream
      • PushbackInputStream
    • ByteArrayInputStream
    • SequenceInputStream
    • StringBufferedInputStream
    • ObjectInputStream
  • Writer
    • BufferedWriter
    • CharArrayWriter
    • InputStreamWriter
      • FileWriter
    • FilterWriter
    • PipedWriter
    • StringWriter
  • OutputStream
    • FileOutputStream
    • PipedOutputStream
    • FilterOutputStream
      • DataOutputStream
      • BufferedOutputStream
      • PrintStream
    • ByteArrayOutputStream
    • ObjectOutputStream

InputStream

  • 바이트 기반의 입력 스트림의 최상위 클래스
  • 추상 클래스
Return Type Method Description
int read() 입력 스트림으로부터 1바이트를 읽고 읽은 데이터 리턴
int read(byte[] b) 입력 스트림으로부터 읽은 데이터들을 바이트 배열 b에 저장하고 실제로 읽은 바이트 수 리턴
int read(byte[] b, int off, int len) 입력 스트림으로부터 len개의 바이트만큼 읽고 바이트 배열 b[off]부터 len개까지를 저장하고 실제로 읽은 바이트 수 리턴 만약 len개를 모두 읽지 못하면 실제로 읽은 바이트 수 리턴
void close() 사용한 시스템 자원 반납 후 입력 스트림을 닫음

OutputStream

  • 바이트 기반의 출력 스트림의 최상위 클래스
  • 추상 클래스
Return Type Method Description
void write(int c) 출력 스트림으로부터 c를 보냄
void write(char[] c) 출력 스트림에 문자 배열 c의 모든 문자를 보냄
void write(char[] c, int off, int len) 출력 스트림에 문자 배열 c[off]부터 len개의 문자를 보냄
void write(String str) 출력 스트림에 str을 보냄
void write(String str, int off, int len) 출력 스트림에 str의 off순번부터 len개의 문자를 보냄
void flush() 버퍼에 잔류하는 모든 문자열 출력
void close() 사용한 시스템 자원 반납 후 출력 스트림을 닫음

파일 File

File 클래스

  • 파일 시스템의 파일을 표현하는 클래스
  • 파일 크기, 파일 속성, 파일 이름 등의 정보와 파일 생성 및 삭제 기능 제공

객체 생성

File file = new File("파일 경로");
File file = new File("C:/data/test.txt");

파일 디렉토리 생성 및 삭제 메소드

Return Type Method Description
boolean createNewFile() 새로운 파일 생성
boolean mkdir() 새로운 디렉토리 생성
boolean mkdirs() 경로상 없는 모든 디렉토리 생성
boolean delete() 파일 또는 디렉토리 삭제

파일 디렉토리 정보 리턴 메소드

Return Type Method Description
boolean canExecute() 파일 실행 가능 여부
boolean canRead() 파일 읽을 수 있는지 여부
boolean canWrite() 파일 변경 가능 여부
String getName() 파일 이름 반환
String getParent() 부모 경로 이름 반환
File getParentFile() 부모 파일 반환
String getPath() 경로 반환
boolean isDirectory() 디렉토리면 참
boolean isFile() 파일이면 참
boolean isHidden() 숨김파일이면 참
long lastModified() 마지막 수정일 리턴
long length() 파일 크기 리턴
String[] list() 디렉토리에 포함된 파일과 디렉토리를 String 배열로 반환
String[] list(FilenameFilter filter) 디렉토리에 포함된 파일과 디렉토리 중 filter에 해당하는 것만 반환
File[] listFiles() 디렉토리에 포함된 파일과 디렉토리를 File 배열로 반환
File[] listFile(FilernameFilter filter) 디렉토리에 포함된 파일과 디렉토리 중 filter에 해당하는 것만 반환

파일 관련 기반 스트림

FileInputStream

  • 파일 데이터를 바이트 단위로 읽을 때 사용
  • 모든 종류의 파일 읽기 가능
  • 객체 생성
    • FileInputStream 객체가 생성될 때 파일과 직접 연결
    • 만약 파일이 존재하지 않으면 예외 발생 (FileNotFound)
      FileInputStream fis = new FileInputStream("C:/data/test.txt");
    

FileOutputStream

  • 파일 데이터를 바이트 단위로 저장할 때 사용
  • 모든 종류의 파일 저장 가능
  • 객체 생성
    • FileOutputStream 객체가 생성될 때 파일과 직접 연결
    • 만약 파일이 존재하지 않으면 자동 생성
    • 이미 존재하는 경우 덮어쓰기
      FileOutputStream fos = new FileOutputStream("C:/data/test.txt");
    
    • 기존 파일에 이어서 작성하고 싶은 경우 아래와 같이 작성
      FileOutputStream fos = new FileOutputStream("C:/data/test.txt", true);
    

FileReader

  • 텍스트 파일로부터 문자 단위로 읽을 때 사용
  • 텍스트 파일만 읽기 가능
  • 객체 생성
    • FileReader 객체가 생성될 때 파일과 직접 연결
    • 만약 파일이 존재하지 않으면 예외 발생 (FileNotFound)
      FileReader fr = new FileReader("C:/data/test.txt");
      FileReader fr = new FileReader(new File("C:/data/test.txt"));
    

FileWriter

  • 텍스트 파일로부터 문자 단위로 저장할 때 사용
  • 텍스트 파일만 저장 가능
  • 객체 생성
    • FileWriter 객체가 생성될 때 파일과 직접 연결
    • 만약 파일이 존재하지 않는 경우 자동 생성
    • 이미 존재하는 경우 덮어쓰기
      FileWriter fw = new FileWriter("C:/data/test.txt");
    
    • 기존 파일에 이어서 작성하고 싶은 경우 아래와 같이 작성
      FileWriter fw = new FileWriter("C:/data/test.txt", true);
    

보조 스트림

보조 스트림 정의

  • 스트림의 기능을 향상시키거나 새로운 기능을 추가할 때 사용
  • 실제 데이터를 주고 받지 않기 때문에 입출력 처리 불가능
  • 기반 스트림 생성 이후 이를 이용하여 보조 스트림 생성 ( 스트림 결합 )

image

보조 스트림 종류

  • 문자 변환
    • InputStreamReader
    • OutputStreamWriter
  • 입출력 성능
    • BufferedInputStream
    • BufferedOutputStream
  • 기본 데이터 타입 출력
    • DataInputStream
    • DataOutputStream
  • 객체 입출력
    • ObjectInputStream
    • ObjectOutputStream
// 기반 스트림 생성
FileInputStream fis = new FileInputStream("Sample.txt");
// 보조 스트림 생성
BufferedInputStream bis = new BufferedInputStream(fis);
// 보조 스트림으로부터 데이터 읽어옴
bis.read();

문자 변환 보조 스트림

  • 소스 스트림이 바이트 기반이지만 데이터가 문자일 경우 사용
  • Reader Writer는 문자 단위로 출력하여 데이터가 문자인 경우 바이트 기반 스트림보다 편리하게 사용 가능

image

성능 향상 보조 스트림

  • 느린 속도에 의해 입출력 성능에 영향을 미치는 소스를 이용하는 경우 사용
  • 입출력 소스와 직접 작업하지 않고 버퍼에 데이터를 모아 한꺼번에 작업하여 성능 향상

image

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

  • 기본 자료형 별 데이터 읽고 쓰기가 가능하도록 기능 제공
  • 입력된 자료형의 순서와 출력될 자료형의 순서 일치

image

  • DataInputStream
    • readBoolean() : boolean
    • readByte() : byte
    • readChar() : char
    • readDouble() : double
    • readFloat() : float
    • readInt() : int
    • readLong() : long
    • readShort() : short
    • readUTF() : String
  • DataOutputStream
    • writeBoolean(Boolean v) : void
    • writeByte(Byte v) : void
    • writeChar(char c) : void
    • writeDouble(double v) : void
    • writeFloat(float v) : void
    • writeInt(int v) : void
    • writeLong(long v) : void
    • writeShort(short v) : void
    • writeUTF() : void

객체 입출력 보조 스트림

  • 객체를 파일 또는 네트워크로 입출력할 수 있는 기능 제공
  • 객체는 문자가 아니므로 바이트 기반 스트림으로 데이터를 변경 ( 직렬화 Serialization )

image

직렬화와 역직렬화

직렬화 Serialization

  • Serializable 인터페이스를 구현
  • 객체 직렬화 시 private 필드를 포함한 모든 필드를 바이트로 변환
  • transient 키워드 사용 필드는 제외

역직렬화 Deserialization

  • 직렬화 했을 때와 동일한 클래스 사용
  • 클래스 이름이 같지만 클래스 내용이 변경된 경우 역직렬화 실패

serialVersionUID 필드

  • 직렬화된 클래스와 같은 클래스 임을 알려주는 식별자 역할
  • 컴파일시 JVM이 자동으로 정적 필드를 추가하여 별도로 작성하지 않아도 오류가 발생하지 않음
  • 역직렬화에서 예상치 못한 InvalidClassException을 유발할 수 있어 명시 권장
private static final long serialVersionUID = 1L;

You might also enjoy