[Java] IO - InputStream, OutputStream, Reader, Writer

naneun·2022년 1월 9일
0

Java

목록 보기
2/7
post-thumbnail

* 본 내용은 학습하면서 정리하는 글입니다. 계속 업데이트됩니다.

2020/01/09 - 최초 작성

java.io 패키지의 주요 클래스

classdescription
File파일 시스템의 파일 정보를 얻기 위한 클래스
InputStream / OutputStream바이트 단위 입출력을 위한 최상위 입출력 스트림 클래스
FileInputStream / FileOutputStream바이트 단위 입출력을 위한 하위 스트림 클래스
DataInputStream / DataOutputStream
ObjectInputStream / ObjectOutputStream
PrintStream
BufferedInputStream / BufferedOutputStream
Reader / Writer문자 단위 입출력을 위한 최상위 입출력 스트림 클래스
FileReader / FileWriter문자 단위 입출력을 위한 하위 스트림 클래스
InputStreamReader / OutputStreamWriter
PrintWriter
BufferedReader / BufferedWriter

🚿 Stream

  • 자바에서 데이터는 스트림(Stream)을 통해 입출력된다.
  • 프로그램이 데이터를 입력받을 때에는 입력 스트림(InputStream)이라 부르고, 프로그램이 테이터를 보낼 때에는 출력 스트림(OuputStream)이라 부른다.

1. InputStream

  • 바이트(Byte) 기반 입력 스트림의 최상위 클래스로 추상 클래스이다.

int read(byte[] buf) throws IOException

  • 입력 스트림으로부터 매개값으로 주어진 바이트 배열의 길이만큼 바이트를 읽고 배열에 저장한다.
  • 읽어들인 바이트 수를 리턴한다.
  • 더 이상 읽을 수 없다면 -1을 리턴한다.
InputStream is = new FileInputStream("C:/test.jpg");
int readByteNo;
byte[] readBytes = new byte[100];
while ((readByteNo = is.read(readBytes)) != -1) { ... }

int read(byte[] buf, int off, int len) throws IOException

  • 입력 스트림으로부터 len개의 바이트만큼 읽고, 매개값으로 주어진 바이트 배열 buf[off]부터 len개까지 저장한다.
  • 읽어들인 바이트 수를 리턴한다.
  • 더 이상 읽을 수 없다면 -1을 리턴한다.
InputStream is = ...;
byte[] readBytes = new byte[100];
int readByteNo = is.read(readBytes, 0, 100);

2. OutputStream

  • 바이트(Byte) 기반 출력 스트림의 최상위 클래스로 추상 클래스이다.

void write(byte[] buf) throws IOException

  • 매개값으로 주어진 바이트 배열의 모든 바이트를 출력 스트림으로 보낸다.
OutputStream os = new FileOutputStream("C:/test.txt");
byte[] data = "ABC".getBytes();
os.write(data); // "ABC" 모두 출력

void write(byte[] buf, int off, int len) throws IOException

  • buf[off]부터 len개의 바이트를 출력 스트림으로 보낸다
OutputStream os = new FileOutputStream("C:/test.txt");
byte[] data = "ABC".getBytes();
os.write(data, 1, 2); // "BC" 출력

3. Reader

  • 문자 기반 입력 스트림의 최상위 클래스로 추상 클래스이다.

int read() throws IOException

  • 입력 스트림으로부터 한 개의 문자(2바이트)를 읽고 4바이트 int 타입으로 리턴한다.
  • 리턴된 4바이트 중 끝에 있는 2바이트에 문자 데이터가 들어 있다.
  • 더 이상 읽을 수 없다면 -1을 리턴한다.
char charData = (char) read();
Reader reader = new FileReader("C:/test.txt");
int readData;
while ((readData = reader.read()) != -1) {
	char charData = (char) readData;
}

int read(byte[] cbuf) throws IOException

  • 입력 스트림으로부터 매개값으로 주어진 문자 배열의 길이만큼 문자 읽고 배열에 저장한다.
  • 읽어들인 문자 수를 리턴한다.
  • 더 이상 읽을 수 없다면 -1을 리턴한다.
Reader reader = new Reader("C:/test.txt");
int readCharNo;
char[] cbuf = new char[2];
while ((readCharNo = reader.read(cbuf)) != -1) { ... }

abstract int read(byte[] cbuf, int off, int len) throws IOException

  • 입력 스트림으로부터 len개의 문자만큼 읽고, 매개값으로 주어진 문자 배열 cbuf[off]부터 len개까지 저장한다.
  • 읽어들인 문자 수를 리턴한다.
  • 더 이상 읽을 수 없다면 -1을 리턴한다.
Reader reader = ...;
byte[] cbuf = new cbuf[100];
int readCharNo = reader.read(cbuf, 0, 100);

4. Writer

  • 문자 기반 출력 스트림의 최상위 클래스로 추상 클래스이다.

void write(int c) throws IOException

  • 매개 변수로 주어진 int 값에서 끝에 있는 2바이트(한 개의 문자)만 출력 스트림으로 보낸다.
    • 매개 변수가 int 타입이므로 4바이트 모두를 보내는 것으로 오해할 수 있다.
Writer writer = new FileWriter("C:/test.txt");
char[] data = "홍길동".toCharArray();
for (int i = 0; i < data.length; ++i) {
	writer.write(data[i]); // "홍", "길", "동"을 하나씩 출력
}

void write(char[] cbuf) throws IOException

  • 매개값으로 주어진 char[] 배열의 모든 문자 출력 스트림으로 보낸다.
Writer writer = new FileWriter("C:/test.txt");
char[] data = "홍길동".toCharArray();
writer.write(data); // "홍길동" 모두 출력

abstract void write(char[] cbuf, int off, int len) throws IOException

  • cbuf[off]부터 len개의 문자를 출력 스트림으로 보낸다
Writer writer = new FileWriter("C:/test.txt");
char[] data = "홍길동".toCharArray();
writer.write(data); // "길동" 모두 출력

void write(String str) throws IOException

  • 문자열 전체를 출력 스트림으로 보낸다.

void void write(String str, int off, int len) throws IOException

  • 주어진 문자열 off순번부터 len개까지의 문자를 보낸다.

OutputStream - void flush() throws IOException

Writer - abstract void flush() throws IOException

  • 출력 스트림은 내부에 버퍼(buffer)가 있어서 데이터가 출력되기 전에 버퍼에 쌓여있다가 순서대로 출력된다.

  • flush() 메소드는 버퍼에 잔류하고 있는 데이터를 모두 출력시키고 버퍼를 비우는 역할을 한다.

  • 프로그램에서 더 이상 출력할 데이터가 없다면 flush() 메소드를 마지막으로 호출하여 버퍼에 잔류하는 모든 데이터가 출력되도록 해야한다.

OutputStream os = new FileOutputStream("C:/test.txt");
byte[] data = "ABC".getBytes();
os.write(data);
os.flush();
os.close();
Writer writer = new FileWriter("C:/test.txt");
String data = "안녕 자바 프로그램";
writer.write(data);
writer.flush();
writer.close();

resource
https://docs.oracle.com/javase/8/docs/api/

profile
riako

0개의 댓글