Java,Spring

[자바 기초 문법] 입출력 처리

뀨린 2021. 5. 26. 19:55

입출력 스트림

 

  스트림이란?

    - 순서가 있는 데이터의 연속적 흐름이다.

    - 데이터 소스와 상관없이 적용할 수 있어 효과적이다.

    - 예시) 키보드 및 모니터 입출력, 프로그램과 외부 장치, 파일의 입출력에서 데이터 흐름도 스트림, 네트워크와 통신하는 데이터의 흐름

 

특징

  • 선입선출 구조라서 순차적으로 흘러가고 순차적으로 접근한다.
  • 임의 접근 파일 스트림을 제외한 모든 스트림은 단방향이다.
  • 입출력 스트림은 객체이다.
  • 출력 스트림과 입력 스트림을 연결해 파이프라인 구성이 가능하다.
  • 지연이 가능하다. (프로그램에 연결한 출력 스트림에 데이터가 가득 차면 프로그램을 더 이상 출력할 수가 없어 빈 공간이 생길때까지 지연된다! 입력 스트림도 마찬가지)

바이트 스트림과 문자 스트림

 

입출력 스트림의 사용

 

바이트 스트림

 

바이트 단위의 이진 데이터를 다루므로 이미지나 동영상 파일을 처리할 때 유용하다. 

 

InputStream과 OutputStream은 각각 read()와 write()라는 추상 메서드를 포함한다. 모든 자식 바이트 스트림에서 공통으로 사용하는 메서드를 포함한 바이트 스트림의 최상위 클래스이다. 

 

  • 바이트 스트림 클래스가 제공하는 주요 메서드
클래스 메서드 설명
InputStream int available() 읽을 수 있는 바이트 개수 반환
void close() 입력 스트림 닫음
abstract int read() 1바이트 읽음
int read(byte b[ ]) 1바이트씩 읽어 b[]에 저장한 후 읽은 개수 반환
int read(byte b[ ], int off, int len) len만큼 읽어 b[]의 off 위치에 저장한 후 읽은 개수 반환
OutputStream void close() 출력 스트림 닫는다
void flush() 출력하려고 버퍼의 내용 비운다
abstract void write(int b) b 값 바이트로 변환해서 쓴다
void write(byte b[ ]) b[ ]값을 바이트로 변환해서 쓴다
void write(byte b[], int off, int len) b[ ]값을 바이트로 변환해서 off 위치부터 len만큼 쓴다.

 

  • FileInputStream과 FileOutputStream

시스템에 있는 모든 파일을 읽거나 쓸 수 있는 기능을 제공한다. 

생성자로 스트림 객체를 생성할 때는 FileNotFoundException 예외 가능성이 있기 때문에 예외 처리가 필요하다.

FileInputStream(String name) //파일 시스템의 경로를 나타내는 문자열이다. 
FileInputStream(File file)
FileOutputStream(String name)
FileInputStream(File file)
FileInputStream(String name, boolean append)
  • BufferedInputStream과 BufferedOutputStream

버퍼는 스트림과 프로그램 간에 데이터를 효율적으로 전송하려고 사용하는 메머리다. 입출력 장치와 프로그램 간 동작 속도가 크게 차이가 날 때 버퍼를 사용하면 효율적이다. 

 

<생성자>

BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in, int size)
BufferedOutputStream(OutputStream out)
BufferedOutputStream(OutputStream out, int size) //버퍼의 크기를 나타낸다.
  • DataInputStream과 DataOutputStream

     - 각각 기초 타입 데이터를 읽는 메서드와 기초 타입 데이터를 기록하는 메서드를 사용할 수 있는 스트림이다. 

     - 직접 키보드에서 데이터를 입력 받거나 콘솔 뷰에 데이터를 출력하기에는 부적합하다. 

     - FileInputStream 및 FileOutputStream 등 다른 스트림과 연결해서 파이프라인을 구성해서 사용한다. 

 

  • PrintStream

     - 다양한 데이터 값을 편리하게 표현할 수 있도록 출력 스트림에 기능을 추가한 스트림이다. IO Exception을 발생하지 않는다. 

     - 자동 플러시 기능을 제공해 flush() 메서드를 호출하지 않고도 버퍼를 비울 수 있다. 

PrintStream(File file)
PrintStream(String filename)
PrintStream(OutputStream out)
PrintStream(OutputStream out, boolean autoFlush) //자동 플러시 기능을 선택할 수도 있다. 

System.out 객체의 println(),print(), printf() 메서드는 PrintStream으로 출력한다. 

 

문자 스트림

 

한글처럼 언어로 된 파일을 처리할 때 유용하다. 

 

 - Rreader과 Writer는 추상메서드인 read(), close()와 write(), flush(), close()를 각각 포함하는 추상 클래스이다. 

 - Reader과 Writer는 객체를 생성할 수 없는 추상 클래스이다. Reader과 Writer의 자식인 구현 클래스를 사용한다. 

 - FileReader과 FileWriter는 파일 입출력 클래스로, 파일에서 문자 데이터를 읽거나 파일에 문자 데이터를 저장할 때 사용한다. 

 - BufferedReader과 BufferedWriter는 데이터를 효율적으로 전송하려고 버퍼로 처리할 때 사용한다. 

  • 문자 스트림 클래스가 제공하는 주요 메서드
클래스 메서드 설명
Reader abstract void close() 입력 스트림을 닫는다
int read() 1개의 문자를 읽는다
int read(char[] cbuf) 문자 단위로 읽어 cbuf[]에 저장한 후 읽은 개수를 반환
abstract int read(char cbuf[ ], int off, int len) len만큼 읽어 cbuf[ ]의 위치에 저장한 후 읽은 개수를 반환
long skip (long n) 입력 스트림을 n 문자만큼 건너뛴다.
Writer abstract void close() 스트림을 닫고 관련된 모든 자원을 반납
abstract void flush() 버퍼의 내용을 비운다
void write(int c) c 값을 char로 변환해 출력 스트림에 쓴다
void write(char cbuf[ ]) cbuf[ ] 값을 char로 변환해 출력 스트림에 쓴다
abstract void write(char cbuf[], int off, int len) cbuf[ ]값을 char로 변환해 off 위치부터 len만큼 출력 스트림에 쓴다
void write(String str) 문자열 str을 출력 스트림에 쓴다.
  • FileReader와 FileWriter

시스템에 있는 모든 문자 파일을 읽거나 쓸 수 있는 기능을 제공한다.

생성자로 스트림 객체를 생성할 때는 FileNotFoundException 예외 처리가 필요하다. 

 

<생성자>

FileReader(String Name)
FileReader(File file)
FileWriter(String Name)
FileWriter(File file)
FileWriter(String Name, boolean append) //true면 이어쓰고(append) False면 덮어쓴다(overwrite)
FileWriter(File file, boolean append)
  • BufferedReader와 BufferedWriter

스트림의 효율을 높이려고 버퍼를 사용한다.

 

<생성자>

BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in, int size)
BufferedOutputStream(OutputStream out)
BufferedOutputStream(OutputStream out, int size) //int size는 버퍼의 크기를 나타낸다.

BufferedReader 클래스에 추가된 주요 메서드

메서드 설명
Stream<String> lines() 읽은 행을 스트림으로 반환한다
String readLine( ) 한 행을 읽어 문자열로 반환한다.
  • InputStreamReader와 InputStreamWriter

바이트 기반의 Input Stream과 OutputStream을 포장해 문자 기반의 Reader과 Writer로 변환하는 클래스이다. 

 

<생성자>

InputStreamReader(InputStream in)
InputStreamReader(InputStream in, Charset cs)
OutputStreamWriter(OutputStream out)
OutputStreamWriter(OutputStream out, Charset cs)
  • PrintWriter

PrintStream처럼 다양한 데이터 값을 편리하게 표현할 수 있도록 출력 스트림에 기능을 추가한 Writer의 자식 클래스이다. 

 

참조: 어서와 Java는 처음이지?

        쉽게 배우는 자바 프로그래밍 2판, 한빛아카데미, 우종정, 2020.