본문 바로가기
공부/Java

자바의 입출력(I/O) 및 File(경로/읽기)을 알아보자

by JERO__ 2022. 9. 8.

스트림(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");   // 내용

 

 

댓글