스트림(Stream)이란?
실제의 입력이나 출력이 표현된 데이터의 이상화된 흐름
자바의 입출력(I/O)를 알아보자
입출력은 데이터를 다른 곳으로 이동 시킬 때 사용된다. 자바는 스트림(Stream)으로 I/O를 사용한다.
1. 입력: InputStream
자바의 기본 입력 클래스이다. byte로 데이터 읽는다. read()
2. 출력: OutputStream
자바의 기본 출력 클래스이다. byte로 데이터 읽는다. write(int b)
종류
- FilterOutputStream : 파일로 데이터 쓰기
- DataOutputStream : 자바의 primitive type data를 다를 매체로 데이터를 쓸 때 사용
- BufferedOutputStream : 버퍼링 사용(효율적인 전송)
- flush()를 사용하여 버퍼가 가득차지 않은 상황에서 강제로 버퍼의 내용을 전송한다.
- Stream은 동기(synchronous)로 동작하기 때문에 버퍼가 찰 때까지 기다리면 데드락(deadlock) 상태가된다. flush로 해제한다.
기본 입출력은 byte로 읽는다! 어떻게 변환할까?
Filter를 사용하면 다른 데이터 형식으로 변환할 수 있다.
final String text = "필터에 연결해보자.";
final InputStream inputStream = new ByteArrayInputStream(text.getBytes());
// BufferedInputStream 필터
final InputStream bufferedInputStream = new BufferedInputStream(inputStream);
final byte[] actual = bufferedInputStream.readAllBytes();
assertThat(bufferedInputStream).isInstanceOf(FilterInputStream.class);
assertThat(actual).isEqualTo("필터에 연결해보자.".getBytes());
File 클래스를 사용해보자
File 클래스를 사용해 파일을 읽고 사용자에게 전달해보자
resource 디렉토리 파일 경로 읽기
final String fileName = "nextstep.txt";
final String actual = this.getClass().getClassLoader().getResource(fileName).getFile();
assertThat(actual).endsWith(fileName);
resource의 파일 내용 읽기
final String fileName = "nextstep.txt";
// 파일 위치
final Path path = Path.of(this.getClass().getClassLoader().getResource(fileName).toURI());
final List<String> actual = Files.readAllLines(path);
assertThat(actual).containsOnly("nextstep"); // 내용
'공부 > Java' 카테고리의 다른 글
전략패턴과 상태패턴의 공통점과 차이점 (0) | 2022.06.06 |
---|---|
IntelliJ 디버깅 해보기 (0) | 2022.05.06 |
SpringBoot에 원하는 오류페이지로 설정하기 (0) | 2022.05.06 |
[JAVA] 한번에 두 개 이상 테스트하기 (0) | 2022.04.30 |
전략패턴 vs 상태패턴 (0) | 2022.04.26 |
댓글