[JAVA] I/O API

제완·2024년 2월 18일
0

JAVA

목록 보기
2/3
post-thumbnail

I/O API란?

데이터의 입력(Input)과 출력(Outut)을 다루기 위한 클래스를 제공하는 패키지

자바의 입・출력 API는 크게 두가지 유형으로 분류된다.
1. 바이트 기반 입・출력(Byte-Based I/O)
2. 문자열 기반 입・출력(Character-Based I/O)

🤔 왜 나누어서 사용하는거지?

  1. 다양한 데이터 형식을 처리하기 위함.
    • 바이트 기반 입・출력은 모든 종류의 데이터를 처리할 수 있어 일반적으로 사용됨.
    • 문자열 기반 입・출력은 주로 텍스트 데이터 처리에 특화되어 텍스트 데이터를 효율적으로 다룰 수 있음.
  2. 문자의 인코딩을 고려하기 위함.
    • 문자열은 인코딩에 영향을 받기에, 문자열 기반 입・출력은 인코딩 설정을 고려하여 처리할 수 있음.
    • 바이트 기반 입・출력은 문자열 데이터를 단순한 바이트로 처리하여 인코딩에 대한 명시적인 처리가 필요
  3. 문자열을 편리하게 다루기 위함.
    • 문자열 기반 입・출력은 문자열과 관련된 다양한 편의 기능을 제공
      BufferedReader, BufferedWriter를 사용하여 텍스트 파일에서 편리하게 한줄씩 읽거나 쓰기 가능

👀 사용되는 클래스

Java의 바이트 기반 I/O는 InputStream 및 OutputStream 클래스를 중심으로 구성되어 있으며
문자열 기반 I/O는 Reader 및 Writer 클래스를 중심으로 구성되어있다.

구분 바이트 기반 입력 바이트 기반 출력 문자열 기반 입력 문자열 기반 출력
추상 클래스
( 최상위 )
InputStream OutputStream Reader Writer
구현 클래스 FileInputStream
ByteArrayInputStream
BufferedInputStream
...
FileOutputStream
ByteArrayOutputStream
BufferedOutputStream
...
FileReader
CharArrayReader
BufferedReader
...
FileWriter
CharArrayWriter
BufferedWriter
...

🐢바이트 기반 입・출력(Byte-Based I/O)

데이터를 바이트 단위로 읽고 쓰는 입출력 방식

InputStream의 주요 메서드

반환형 메서드 설명
int read() 다음 바이트를 읽고 읽은 바이트 값을 반환합니다.
읽을 데이터가 없다면 -1을 반환합니다.
int read(byte[] b) 바이트 배열 b로부터 데이터를 읽고 읽은 바이트 수를 반환합니다.
int read(byte[] b, int off, int len) 바이트 배열 b의 지정된 오프셋(off)에서부터 최대 len만큼의 바이트를 읽고
읽은 바이트 수를 반환합니다.
void close() 입력 스트림을 닫습니다.

OutputStream의 주요 메서드

반환형 메서드 설명
void write(int b) 하나의 바이트를 출력합니다.
void write(byte[] b) 바이트 배열 b를 출력합니다.
void write(byte[] b, int off, int len) 바이트 배열 b의 지정된 오프셋(off)에서부터 최대 len만큼의 바이트를
출력합니다.
void flush() 출력 스트림의 버퍼를 비우고 모든 데이터를 출력합니다.
void close() 출력 스트림을 닫습니다.

바이트 기반 입・출력의 동작

  1. 입력 스트림 열기
InputStream inputStream = new FileInputStream("D:\\tmp\\target.txt");
  1. 데이터 읽기
// 1byte씩 읽기
int data = inputStream.read(); // 72(H) 105(i) 32( ) 109(m) ...


// 배열의 길이만큼 읽기
byte[] buffer = new byte[16]; // [72, 105, 32, 109, ... ] 
int bytesRead = inputStream.read(buffer); // 16 = 읽은 데이터의 byte 수
  1. 출력 스트림 열기
OutputStream outputStream = new FileOutputStream("D:\\tmp\\target.txt");
  1. 데이터 쓰기
// 1byte씩 쓰기
outputStream.write(data);


// byte배열(buffer)을 offset(0)에서부터 len(bytesRead)만큼 쓰기
outputStream.write(buffer, 0, bytesRead);
  1. 스트림 닫기
inputStream.close();
outputStream.close();

구현

>D:\\tmp\\target.txt
Hi my name is...
public static void main(String[] args) throws IOException {

    String filePath = "D:\\tmp\\target.txt";
   	
    try {
        // 파일 내용을 읽어오기
        FileInputStream fileInputStream = new FileInputStream(filePath);
        byte[] buffer = new byte[16];
        fileInputStream.read(buffer);
        fileInputStream.close();

        // 기존 내용을 문자열로 변환
        String text = new String(buffer);

        // "..."을 " Jewan"으로 대체
        text = text.replace("...", " Jewan");

        // 대체된 내용을 파일에 쓰기
        FileOutputStream fileOutputStream = new FileOutputStream(filePath);
        fileOutputStream.write(text.getBytes());
        fileOutputStream.close();
    }
    catch (IOException e) {
        e.printStackTrace();
    }
}
>D:\\tmp\\target.txt
Hi my name is Jewan

🐇문자열 기반 입・출력(Charater-Based I/O)

데이터를 문자 단위로 읽고 쓰는 입출력 방식

Reader의 주요 메서드

반환형 메서드 설명
int read() 다음 문자를 읽고 읽은 문자 값을 반환합니다.
1읽을 데이터가 없다면 -1을 반환합니다.
int read(char[] c) 문자 배열 c로부터 데이터를 읽고 읽은 문자 수를 반환합니다.
int read(char[] c, int off, int len) 문자 배열 c의 지정된 오프셋(off)에서부터 최대 len만큼의 문자를 읽고
읽은 문자 수를 반환합니다.
void close() 입력 스트림을 닫습니다.

Writer의 주요 메서드

반환형 메서드 설명
void write(int c) 하나의 문자를 출력합니다.
void write(char[] c) 문자 배열 c를 출력합니다.
void write(char[] c, int off, int len) 문자 배열 c의 지정된 오프셋(off)에서부터 최대 len만큼의 문자를
출력합니다.
void flush() 출력 스트림의 버퍼를 비우고 모든 데이터를 출력합니다.
void close() 출력 스트림을 닫습니다.

바이트 기반 입・출력의 동작

  1. 입력 스트림 열기
Reader reader = new FileReader("D:\\tmp\\target.txt");
  1. 데이터 읽기
// 한 문자씩 읽기
int data = reader.read(); // 72(H) 105(i) 32( ) 109(m) ...


// 배열의 길이만큼 읽기
char[] buffer = new char[16]; // [H, i,  , m, ... ] 
int charsRead = reader.read(buffer); // 16 = 읽은 데이터의 문자 수
  1. 출력 스트림 열기
Writer writer = new FileWriter("D:\\tmp\\target.txt");
  1. 데이터 쓰기
// 한 문자씩 쓰기
writer.write(data);


// 문자 배열(buffer)을 offset(0)에서부터 len(charsRead)만큼 쓰기
writer.write(buffer, 0, charsRead);
  1. 스트림 닫기
reader.close();
writer.close();

구현

public static void main(String[] args) {

    String filePath = "D:\\tmp\\target.txt";

    try {
        // 파일 내용을 읽어오기
        FileReader fileReader = new FileReader(filePath);
        char[] buffer = new char[16];
        fileReader.read(buffer);
        fileReader.close();

        // 기존 내용을 문자열로 변환
        String text = new String(buffer);

        // "..."을 " Jewan"으로 대체
        text = text.replace("...", " Jewan");

        // 대체된 내용을 파일에 쓰기
        FileWriter fileWriter = new FileWriter(filePath);
        fileWriter.write(text);
        fileWriter.close();
    }
    catch (IOException e) {
        e.printStackTrace();
    }
}
profile
반갑습니다. 좋은 하루 되세요.👍🏻

1개의 댓글

comment-user-thumbnail
2024년 2월 19일

자동 필터링 때문에 글이 비공개 처리가 됨
이미지에 들어간 url이 원인이었음

답글 달기

관련 채용 정보