자바 스터디

13주차 과제: I/O

삶은겨란 2022. 6. 15. 04:58

목표

자바의 Input과 Ontput에 대해 학습하세요.

목차

1. 스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O

2. InputStream과 OutputStream

3. Byte와 Character 스트림

4. 표준 스트림 (System.in, System.out, System.err)

5. 파일 읽고 쓰기


1. 스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O

  • 스트림(Stream)

데이터 전송 통로

- 스트림은 단방향이라 입출력을 동시에 하기 위해선 input stream, output stream이 필요하다.

- 큐 형식(FIFO)을 가진다.

- 스트림은 입출력 장치와 자바 응용프로그램을 연결

- 바이트나 문자 단위로 입출력

 

  • 버퍼(Buffer)

데이터 임시 저장 공간

버퍼를 사용하면 입력을 저장했다가 한 번에 보낸다.

 

  • 채널(Channel)

양방향으로 하나의 채널로 입출력이 가능하며 비동기적으로 데이터를 읽고 쓸 수 있다.

 

 

2. InputStream과 OutputStream

바이트 단위 입출력을 위한 최상위 클래스

하위 스트림 클래스 입출력 대상
FileInputStream/FileOutputStream 파일
ByteArrayInputStream/ByteArrayOutputStream 메모리
PipedInputStream/PipedOutputStream 프로새스
AudioInputStream/AudioOutputStream 오디오

 

InputStream 메소드

메소드 내용
int read(byte[] b) 읽은 바이트들을 배열에 저장하고 읽은 바이트 수를 반환
int read(byte[] b, int off, int len) 배열의 off위치에 len만큼의 바이트를 읽어서 읽은 바이트 수를 반환
abstract int read() 1바이트를 읽고 int 값으로 반환. 읽어올 데이터가 없으면 -1을 반환
int available() 읽을 수 있는 바이트 수 반환
void close() 사용하던 자원을 반환하고 스트림을 닫음
void mark(int readlimit) 현재 위치를 표시
boolean markSupported() mark()와 reset()은 선택적으로 지원하는 기능이기 때문에, 해당 기능을 지원하는지 확인
void reset() mark()를 마지막으로 호출한 위치로 이동
long skip(long n) n바이트 데이터를 스킵한고 바이트 수를 반환

 

OutputStream 메소드

메소드 내용
void write(byte[] b)  배열에 저장된 내용 출력
void write(byte[] b, int off, int len) 배열의 off부터 len 만큼을 출력
abstsract void write(int b) 정수 b 의 하위 1바이트를 출력
void close() 스트림 닫음
void flush() 버퍼에 남은 출력 스트림을 출력

 

 

3. Byte와 Character 스트림

바이트 기반 스트림의 최상위 - InputStream, OutpuStream

문자 기반 스트림의 최상위 - Reader, Writer

 

(1) 바이트 기반 스트림

바이트를 다루기 때문에 문자든 이미지든 보낼 수 있다.

바이트 스트림을 다루는 클래스는 공통적으로 이름 뒤에 Stream을 붙인다.

 

 

(2)  문자 기반 스트림

문자만 다루며 문자 하나의 크기는 2바이트이다.

문자 스트림을 다루는 클래스는 Reader/Writer를 붙인다.

 

4. 표준 스트림 (System.in, System.out, System.err)

표준 입출력으로 콘솔로부터의 데이터 출입력.

  • System.in : 콘솔로부터 데이터를 입력받음
  • System.out : 콘솔로부터 데이터를 출력
  • System.err : 콘솔로 오류를 출력

 

 

5. 파일 읽고 쓰기

클래스 내용
FileWriter 문자 기반 스트림. 텍스트를 파일에 저장.
BufferedWriter 버퍼에 받아 파일에 쓴다
FileReader 파일 읽는 기능 제공
BufferedReader 버퍼에 받아 파일을 출력한다

 

파일생성

File file = new File("파일경로");

 

FileWriter

import java.io.FileWriter;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("test.txt", true); // 기존에 있는 파일이라면 덮어쓰고, true를 설정하면 기존파일에 이어서 쓴다. 
        fw.write("파일에 글을 써보자");
        fw.close();
    }
}

 

BufferedWriter

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new FileWriter("파일경로"));
        bw.write("버퍼를 이용해서");
        bw.write("파일에 글을 써보자");
        bw.close();
    }
}

BufferedWriter와 FileWriter를 같이 사용하면 속도가 향상된다.

 

FileReader

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("파일경로");
        String str;
        while((str = fr.readLine()) != null){
            System.out.println(str);
        }
        fr.close();
    }
}

 

BufferedReader

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("파일경로");
        BufferedReader br = new BufferedReader(fr);
        String str;
        while((str = br.readLine()) != null){
            System.out.println(str);
        }
        br.close();
    }
}

명품 JAVA Programming/황기태,김효수

https://developer-hm.tistory.com/38