데이터의 입력(Input)과 출력(Outut)을 다루기 위한 클래스를 제공하는 패키지
자바의 입・출력 API는 크게 두가지 유형으로 분류된다.
1. 바이트 기반 입・출력(Byte-Based I/O)
2. 문자열 기반 입・출력(Character-Based I/O)
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 ... |
데이터를 바이트 단위로 읽고 쓰는 입출력 방식
반환형 | 메서드 | 설명 |
---|---|---|
int | read() |
다음 바이트를 읽고 읽은 바이트 값을 반환합니다. 읽을 데이터가 없다면 -1을 반환합니다. |
int | read(byte[] b) | 바이트 배열 b로부터 데이터를 읽고 읽은 바이트 수를 반환합니다. |
int | read(byte[] b, int off, int len) |
바이트 배열 b의 지정된 오프셋(off)에서부터 최대 len만큼의 바이트를 읽고 읽은 바이트 수를 반환합니다. |
void | close() | 입력 스트림을 닫습니다. |
반환형 | 메서드 | 설명 |
---|---|---|
void | write(int b) | 하나의 바이트를 출력합니다. |
void | write(byte[] b) | 바이트 배열 b를 출력합니다. |
void | write(byte[] b, int off, int len) |
바이트 배열 b의 지정된 오프셋(off)에서부터 최대 len만큼의 바이트를 출력합니다. |
void | flush() | 출력 스트림의 버퍼를 비우고 모든 데이터를 출력합니다. |
void | close() | 출력 스트림을 닫습니다. |
InputStream inputStream = new FileInputStream("D:\\tmp\\target.txt");
// 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 수
OutputStream outputStream = new FileOutputStream("D:\\tmp\\target.txt");
// 1byte씩 쓰기
outputStream.write(data);
// byte배열(buffer)을 offset(0)에서부터 len(bytesRead)만큼 쓰기
outputStream.write(buffer, 0, bytesRead);
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
데이터를 문자 단위로 읽고 쓰는 입출력 방식
반환형 | 메서드 | 설명 |
---|---|---|
int | read() |
다음 문자를 읽고 읽은 문자 값을 반환합니다. 1읽을 데이터가 없다면 -1을 반환합니다. |
int | read(char[] c) | 문자 배열 c로부터 데이터를 읽고 읽은 문자 수를 반환합니다. |
int | read(char[] c, int off, int len) |
문자 배열 c의 지정된 오프셋(off)에서부터 최대 len만큼의 문자를 읽고 읽은 문자 수를 반환합니다. |
void | close() | 입력 스트림을 닫습니다. |
반환형 | 메서드 | 설명 |
---|---|---|
void | write(int c) | 하나의 문자를 출력합니다. |
void | write(char[] c) | 문자 배열 c를 출력합니다. |
void | write(char[] c, int off, int len) |
문자 배열 c의 지정된 오프셋(off)에서부터 최대 len만큼의 문자를 출력합니다. |
void | flush() | 출력 스트림의 버퍼를 비우고 모든 데이터를 출력합니다. |
void | close() | 출력 스트림을 닫습니다. |
Reader reader = new FileReader("D:\\tmp\\target.txt");
// 한 문자씩 읽기
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 = 읽은 데이터의 문자 수
Writer writer = new FileWriter("D:\\tmp\\target.txt");
// 한 문자씩 쓰기
writer.write(data);
// 문자 배열(buffer)을 offset(0)에서부터 len(charsRead)만큼 쓰기
writer.write(buffer, 0, charsRead);
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();
}
}
자동 필터링 때문에 글이 비공개 처리가 됨
이미지에 들어간 url이 원인이었음