[Java] IO 기반 입출력 및 네트워킹 ①

kiteB·2022년 4월 26일
0

Java2

목록 보기
22/36
post-thumbnail

[ IO 패키지 소개 ]

  • 프로그램에서 데이터를 외부에서 읽고 다시 외부로 출력하는 작업이 빈번히 일어난다.
  • 자바에서 데이터는 스트림을 통해 입출력되므로 스트림의 특징을 잘 이해해야 한다.

💡 스트림(Stream)

  • 단일 방향(출발지 → 도착지)으로 연속적으로 흘러가는 것
  • 데이터의 흐름 또는 연결 통로

[ 스트림 ]

스트림 종류

프로그램이 출발지냐 또는 도착지냐에 따라 스트림의 종류가 결정된다.

  • 프로그램이 데이터를 입력받을 때에는 입력 스트림(Input Stream)
  • 프로그램이 데이터를 보낼 때에는 출력 스트림(Output Stream)
  • 입력 스트림의 출발지는 키보드, 파일, 네트워크상의 프로그램이 될 수 있고,
    출력 스트림의 도착지는 모니터, 파일, 네트워크상의 프로그램이 될 수 있다.
  • 항상 프로그램을 기준으로 데이터가 들어오면 입력 스트림이고, 데이터가 나가면 출력 스트림이다.
  • 스트림은 단방향이므로 하나의 스트림으로 입력과 출력을 모두 할 수 없다.
    • 프로그램이 네트워크상의 다른 프로그램과 데이터 교환을 하기 위해서는 양쪽 모두 입력 스트림과 출력 스트림이 따로 필요하다.

java.io 패키지

자바의 기본적인 데이터 입출력 API는 java.io 패키지에서 제공하고 있다.

java.io 패키지에는 파일 시스템의 정보를 얻기 위한 File 클래스와 데이터를 입출력하기 위한 다양한 입출력 스트림 클래스를 제공하고 있다.

  • 스트림 클래스는 크게 바이트 기반 스트림문자 기반 스트림, 두 종류로 구분된다.
    • 바이트 기반 스트림: 모든 종류의 데이터(그림, 멀티미디어, 문자 등) 받고 보낼 수 있음.
    • 문자 기반 스트림: 오로지 문자만 받고 보낼 수 있도록 특화되어 있음.
  • 바이트 기반 스트림과 문자 기반 스트림은 최상위 클래스에 따라서 다음과 같이 구분된다.

[ InputStream ]

바이트 기반 입력 스트림의 최상위 클래스추상 클래스이다.

모든 바이트 기반 입력 스트림은 이 클래스를 상속받아서 만들어진다.

✅ InputStream 클래스 주요 메소드

  • InputStream 클래스에는 바이트 기반 입력 스트림이 기본적으로 가져야 할 메소드가 정의되어 있다.

read() 메소드

입력 스트림으로부터 1바이트를 읽고 4바이트 int 타입으로 리턴한다.
따라서 리턴된 4바이트 중 끝의 1바이트에만 데이터가 들어 있다.

  • 더 이상 입력 스트림으로부터 바이트를 읽을 수 없다면 -1을 리턴한다.

🐥 예제

  • 읽을 수 있는 마지막 바이트까지 루프를 돌며 한 바이트씩 읽는다.
InputStream is = new FileInputStream("C:/test.jpg");
int readByte;
while ((readByte=is.read()) != -1) { ... }

read(byte[] b) 메소드

입력 스트림으로부터 매개값으로 주어진 바이트 배열의 길이만큼 바이트를 읽고 배열에 저장한다. 그리고 읽은 바이트 수를 리턴한다.

  • 실제로 읽은 바이트 수가 배열의 길이보다 작을 경우 읽은 수만큼만 리턴한다.
  • 입력 스트림으로부터 바이트를 더 이상 읽을 수 없다면 -1을 리턴한다.

🐥 예제

InputStream is = new FileInputStream("C:/test.jpg");
int readByteNo;
byte[] readBytes = new byte[100];
while ((readByteNo=is.read(readBytes)) != -1) { ... }

입력 스트림으로부터 100개의 바이트가 들어온다면 read() 메소드는 100번을 루핑해서 읽어들여야 한다. 그러나 read(byte[] b) 메소드는 한 번 읽을 때 매개값으로 주어진 바이트 배열 길이만큼 읽기 때문에 루핑 횟수가 현저히 줄어든다. 그러므로 많은 양의 바이트를 읽을 때는 read(byte[] b) 메소드를 사용하는 것이 좋다.


read(byte[] b, int off, int len) 메소드

입력 스트림으로부터 len개의 바이트만큼 읽고, 매개값으로 주어진 바이트 배열 b[off]부터 len개까지 저장한다. 그리고 읽은 바이트 수인 len개를 리턴한다.

  • 실제로 읽은 바이트 수가 len개보다 작을 경우 읽은 수만큼 리턴한다.
  • 입력 스트림으로부터 바이트를 더 이상 읽을 수 없다면 -1을 리턴한다.
  • read(byte[] b)와의 차이점은
    • 한 번에 읽어들이는 바이트 수를 len 매개값으로 조절할 수 있고,
    • 배열에서 저장이 시작되는 인덱스를 지정할 수 있다는 점이다.
  • 만약 off0으로, len을 배열의 길이로 준다면 read(byte[] b)와 동일하다.

🐥 예제

//read(byte[] b)
InputStream is = ...;
byte[] readBytes = new byte[100];
int readByteNo = is.read(readBytes);
// read(byte[] b, int off, int len)
InputStream is = ...;
byte[] readBytes = read byte[100];
int readByteNo = is.read(readBytes, 0, 100);

close() 메소드

InputStream을 더 이상 사용하지 않을 경우에는 close() 메소드를 호출해서 InputStream에서 사용했던 시스템 자원을 풀어준다.

is.close()

[ OutputStream ]

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

모든 바이트 기반 출력 스트림 클래스는 이 클래스를 상속받아서 만들어진다.

OutputStream 클래스 주요 메소드

  • OutputStream 클래스에는 모든 바이트 기반 출력 스트림이 기본적으로 가져야 할 메소드가 정의되어 있다.

write(int b) 메소드

매개 변수로 주어진 int 값에서 끝에 있는 1바이트만 출력 스트림으로 보낸다.

  • 매개 변수가 int 타입이므로 모두를 보내는 것으로 오해할 수 있다.

🐥 예제

OutputStream os = new FileOutputStream("C:/test.txt");
byte[] data = "ABC".getBytes();
for (int i = 0; i < data.length; i++) {
    os.write(data[i]);	//"A", "B", "C"를 하나씩 출력
}

write(byte[] b) 메소드

매개값으로 주어진 바이트 배열의 모든 바이트를 출력 스트림으로 보낸다.

🐥 예제

OutputStream os = new FileOutputStream("C:/test.txt");
byte[] data = "ABC".getBytes();
os.write(data);	//"ABC"를 모두 출력

write(byte[] b, int off, int len) 메소드

b[off]부터 len개의 바이트를 출력 스트림으로 보낸다.

🐥 예제

OutputStream os = new FileOutputStream("C:/test.txt");
byte[] data = "ABC".getBytes();
os.write(data, 1, 2);	//"BC"만 출력

flush()와 close() 메소드

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

  • flush() 메소드버퍼에 잔류하고 있는 데이터를 모두 출력시키고 버퍼를 비우는 역할을 한다.
  • 프로그램에서 더 이상 출력할 데이터가 없다면 flush() 메소드를 마지막으로 호출하여 버퍼에 잔류하는 모든 데이터가 출력되도록 해야 한다.
  • OutputStream을 더 이상 사용하지 않을 경우에는 close() 메소드를 호출해서 OutputStream에서 사용했던 시스템 자원을 풀어준다.

🐥 예제

OutputStream os = new FileOutputStream("C:/test.txt");
byte[] data = "ABC".getBytes();
os.write(data);
os.flush();
os.close();

[ 참고자료 ]

이것이 자바다 책
http://www.tcpschool.com/java/java_io_stream
https://joolog.tistory.com/entry/21-JAVA-IO-Input-Output-%ED%8C%8C%EC%9D%BC-%EC%9E%85%EC%B6%9C%EB%A0%A5-%EC%8A%A4%ED%8A%B8%EB%A6%BC-%ED%8C%8C%EC%9D%BC-File-%ED%81%B4%EB%9E%98%EC%8A%A4

profile
🚧 https://coji.tistory.com/ 🏠

0개의 댓글