1. Stream
2. Java의 Stream
- 바이트 기반 스트림
- 문자 기반 스트림
3. Java의 보조 Stream(필터 Stream)
- InputStreamReader
- OutputStreamWriter
- Buffer(버퍼)
- BufferedInputStream과 BufferedReader
- BufferedOutputStream과 BufferedWriter
* Stream 상속 관계
1. Stream
- 단방향으로 이동하는 데이터의 흐름.
- 프로그램을 기준으로, 프로세스가 데이터의 도착지면 입력 스트림(InputStream) / 프로세스가 데이터의 출발지면 출력 스트림(OutputStream)
- Stream은 사용이 끝난 후 .close()로 자원을 해제해야 한다, 보조(필터) 스트림이 닫히면 연결된 기본 스트림도 닫힌다.
(try with resource 문을 사용해서 try문의 ()안에 stream을 입력하면 try문 종료 후 자동으로 close 한다)
2. Java의 Stream
"java.io" 패키지에서 다양한 입출력 스트림 클래스를 제공한다. 크게, 바이트/문자 기반 스트림으로 나눈다.
1) 바이트 기반 스트림
다양한 형태의 데이터를 주고 받을 수 있는 스트림.
- InputStream
- 바이트 기반 입력 스트림의 최상위 추상 클래스.
- 하위 클래스는 __InputStream 의 이름을 가진다. ex) FileInputStream
- .read() : InputStream 클래스의 주요 메소드로 InputStream으로부터 1byte를 읽고, return type은 int다. 따라서 int의 4byte 중 마지막 1byte에만 데이터가 저장된다. 더 이상 읽을 데이터가 없다면 -1을 return.
ex) 00000000 00000000 00000000 10101010 - .read(byte[] b) : 파라미터로 전달된 byte 배열에 InputStream으로부터 byte 단위로 읽어들인 데이터를 저장한다.
- OutputStream
- 바이트 기반 출력 스트림의 최상위 추상 클래스
- 하위 클래스는 __OutputStream 의 이름을 가진다. ex) FileOutputStream
- .write(byte[] b) : OutputStream 클래스의 주요 메소드로, write() 파라미터로 전달된 데이터를 OutputStream으로 1byte씩 출력한다.
ex) int b = 0x12345678, write(int b) 하면 write는 1byte만 전송하기 때문에 0x78만 전달해서 데이터 손실이 발생한다. - .write(int b) : 파라미터로 전달된 데이터를 byte 단위로 OutputStream에 출력한다. int의 4byte 중 마지막 1byte만 전송.
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopyExample {
public static void main(String[] args) {
String sourceFile = "source.txt"; // 원본 파일 경로
String destinationFile = "destination.txt"; // 복사할 파일 경로
// try-with-resources: 자동으로 스트림을 닫아줌
try (FileInputStream inputStream = new FileInputStream(sourceFile);
FileOutputStream outputStream = new FileOutputStream(destinationFile)) {
// 1바이트씩 읽고 쓰기
int byteData;
while ((byteData = inputStream.read()) != -1) {
outputStream.write(byteData); // 읽은 바이트를 그대로 파일에 씀
}
System.out.println("파일 복사가 완료되었습니다.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
2) 문자 기반 스트림
오직 문자만 주고 받을 수 있는 스트림.
- Reader
- 문자 기반 입력 스트림의 최상위 추상 클래스.
- 하위 클래스는 __Reader 의 이름을 가진다. ex) FileReader
- .read() : Reader 클래스의 주요 메소드로 입력 대상으로부터 2byte씩 읽고, return type은 int다. 따라서 int의 마지막 2byte에만 데이터가 저장된다. 더 이상 읽을 데이터가 없다면 -1을 return.
ex) 00000000 00000000 00010010 00110100 - .read(char[] cbuf) : 파라미터로 전달된 char 배열에 2byte씩 읽어온 데이터를 저장한다.
- Writer
- 문자 기반 출력 스트림의 최상위 추상 클래스.
- 하위 클래스는 __Writer 의 이름을 가진다. ex) FileWriter
- .write(int c), .write(char[] cbuf), .write(String str) 등등 : 파라미터로 전달된 데이터를 2byte씩(char) 전송한다.
3. Java의 보조 Stream(필터 Stream)
다른 Stream과 연결되어 여러가지 편의 기능을 제공하는 Stream.
InputStreamReader
- InputStreamReader 클래스는 바이트 입력 스트림인 InputStream을 문자 입력 스트림인 Reader 스트림으로 변환하는 스트림.(InputStreamReader : InputStream -> Reader)
InputStream inputStream = new FileInputStream(filePath);
Reader reader = new InputStreamReader(inputStream);
OutputStreamWriter
- OutputStreamWriter 클래스는 바이트 출력 스트림인 OutputStream을 문자 출력 스트림인 Writer 스트림으로 변환하는 스트림. (OutputStreamWriter : OutputStream -> Writer)
InputStream inputStream = new FileInputStream(filePath);
Reader reader = new InputStreamReader(inputStream);
Buffer(버퍼)
데이터를 임시로 모아두고, 일정 크기가 되었을 때 한번에 내보내기 위해 사용. (연산 장치와 보조 기억 장치의 속도 차이를 개선)
BufferedInputStream
- 바이트 단위로 파일을 읽을 때 속도를 향상시키기 위해 사용.
- 바이너리 파일을 읽을 때 사용.
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class BufferedInputStreamExample {
public static void main(String[] args) {
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("example.txt"))) {
int byteData;
while ((byteData = bis.read()) != -1) {
System.out.print((char) byteData); // 읽은 바이트를 문자로 출력
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
BufferedReader
- 문자 단위로 파일을 읽을 때 속도를 높이기 위해 사용.
- 텍스트 파일을 읽을 때 사용.
- readLine() : \r, \n으로 구분된 행 단위의 문자열(한 줄 단위)을 한꺼번에 가져올 수 있다. 데이터 다 읽으면 null을 return.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReaderExample {
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line); // 한 줄씩 출력
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
BufferedOutputStream
- 바이트 단위로 데이터를 파일에 쓸 때 속도를 향상시키기 위해 사용.
- 바이너리 파일(이미지, 오디오)을 파일에 출력할 때 사용.
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class BufferedOutputStreamExample {
public static void main(String[] args) {
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.txt"))) {
String data = "Hello, World!";
bos.write(data.getBytes()); // 문자열을 바이트 배열로 변환하여 출력
} catch (IOException e) {
e.printStackTrace();
}
}
}
BufferedWriter
- 문자 단위로 파일에 데이터를 쓸 때 속도를 높이기 위해 사용.
- 텍스트 데이터를 파일에 출력할 때 사용.
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedWriterExample {
public static void main(String[] args) {
try (BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
String data = "Hello, World!";
bw.write(data); // 문자열을 출력
} catch (IOException e) {
e.printStackTrace();
}
}
}
* Stream 상속 관계
2024.08.29 - [Java/연습 문제] - [Java 연습 문제] Text file 입출력
[Java 연습 문제] Text file 입출력
문제텍스트 파일의 이름을 main 함수의 argument로 받아서 파일의 내용을 요약해서 출력.터미널에서 java FileDetails Yesterday.txt 하면 txt파일을 넘겨주면서 실행한다. Text file/* Yesterday.txt */YesterdayYesterda
lightningtech.tistory.com
2024.08.30 - [Java/연습 문제] - [Java 연습 문제] 텍스트 파일의 소문자 복사본 생성
[Java 연습 문제] 텍스트 파일의 소문자 복사본 생성
문제텍스트 파일의 이름을 입력 받아 파일을 읽은 후, 읽은 파일의 모든 문자를 소문바로 변경한 복사본을 생성하는 프로그램을 작성하시오. 코드import java.io.*;import java.util.Scanner;public class CopyFi
lightningtech.tistory.com
2024.09.08 - [Java/연습 문제] - [Java 연습문제] Iterable과 Comparable * - Book 예제
[Java 연습문제] Iterable과 Comparable * - Book 예제
"book.csv"을 읽어서 Book 객체로 변환한 후, 이를 LinkedList에 저장한다. Books 클래스는 Iterator 패턴을 통해 for-each문으로 쉽게 순회할 수 있다. 코드 book.csv더보기더보기더보기더보기더보기1|이노베
lightningtech.tistory.com
참고 및 출처
'Java' 카테고리의 다른 글
[Java] Naming Convention: Camel Case, Pascal Case (0) | 2024.11.06 |
---|---|
[Java] String, StringBuilder, StringBuffer (1) | 2024.10.06 |
[Java] Java Logging (0) | 2024.09.11 |
[Java] Maven (메이븐) (2) | 2024.09.11 |
[Java] 14. Collections Framework (0) | 2024.09.02 |