Hello, Android!

I/O 입출력 (출력) 본문

Kotlin

I/O 입출력 (출력)

lwndnjs93 2020. 8. 15. 16:21

I/O는 input output으로 데이터를 필요로 하는곳으로 보내고

파일에 저장하거나 읽어올수 있다

 

- 표준 입출력

출력의 대표로는 우리가 자주 사용하던 print함수가 있다

이는 표준 출력이며, 내부적으로는 자바의 System.out.println()을 호출한다

표준 입력으로는 readLine() 함수가 있으며, 입력받은 데이터를 String으로 반환한다

readLine()는 String타입으로 반환하지만, int로 바로 캐스팅을 할려면

readLine()!!.toInt() 혹은 readLine()?.toInt() 의 형태로 사용하면 된다

여기서 !! 이나 ? 를 사용하여 null이 될수없게 하거나 null을 허용하는 것은

입력에 실패하는 경우 null 가능성이 생기기 때문이다

 

- 파일 입출력

파일을 위해 Files클래스의 write함수를 사용하였다

Paths클래스를 사용하여 경로를 지정하며, 저장할 데이터는 toByteArray로 지정하며

파일 생성의 옵션은 StandardOpenOption를 사용하여 파일 생성으로 지정하였다

StandardOpenOption은 파일 생성 이외에도 여러 옵션이 있다

- READ : 파일을 읽기용으로 연다

- WRITE : 파일을 쓰기용으로 연다

- APPEND : 파일이 존재하면 파일의 마지막에 추가한다

- CREATE : 파일이 없으면 새 파일을 생성한다

또한 파일 생성에 예외 발생을 대비하여 try catch문으로 IO예외 상황에 대비해야 한다

 

최상단의 import를 보면 IOException은 java.io.IOException 에서 사용하고 있으며

나머지 다른 file, files는 java.nio 에 있는 것들을 사용한다

java.io는 자바에서 파일 입출력을 위한 기본적인 패키지가 있으며

java.nio(new input output)는 자바7부터 제공되는 강화된 라이브러리이다

java.io와 java.nio를 비교하면 기본적으로는 버퍼 사용에서 스트림, 채널의 차이가 있다

  java.io java.nio
입출력 스트림 방식 채널 방식
버퍼 방식 넌버퍼(non-buffer) 버퍼(buffer)
비동기 지원 지원 안함(블로킹) 지원함(넌블로킹 지원)

  

- 스트림, 채널

스트림은 데이터의 방향에 따라 입력, 출력 스트림이 있다

만약 데이터를 읽고 쓰는 두 작업을 할때 InputStream, OutputStream을

별도로 만들어야한다

하지만 channel은 양방향으로 입력과 출력이 가능하기때문에

별도로 만들어줄 필요가 없다

 

- 논버퍼, 버퍼

스트림 방식에서는 1바이트를 작성하면 스트림이 1바이트를 바로바로 읽어들인다

하지만 버퍼에서는 입력속도에 비해 출력속도가 느린 경우 데이터를 임시 저장하여

프로그램에서 처리 가능한 상황이거나, 버퍼가 가득차거나, 개행문자가 입력되면

버퍼에 저장된 데이터를 한번에 전송하게 된다 

이러한 차이로 버퍼보다 스트림이 느리게 동작한다

이를 보완하기 위해 io에서는 버퍼와 병합하여 사용하는

BufferedInputStream, BufferedOutputStream을 사용하기도 한다

하지만 nio에서는 기본적으로 버퍼를 사용하는 입출력이기 때문에

더 나은 성능을 보장한다

 

- 블로킹, 논블로킹

블로킹은 I/O작업시 대상 파일이 아직 준비되어 있지 않은 경우

프로세스는 대기상태가 되어 그동안 다른 작업을 처리할수 없다

논블로킹은 호출 직후 스레드, 비동기 루틴에 맡겨 별개의 흐름으로 

작업하게 되는 것을 넌블로킹 이라고 한다

 

- PrintWriter

java.io에서 자주 사용하는 printWriter는

print(), println(), printf(), write() 등등 파일에 출력하는 메서드를 지원하여

바이트 단위로 파일에 출력이 가능하다

파일 입출력의 경우 보통은 사용을 한 뒤 close로 직접 닫아줘야한다

하지만 확장함수 use를 사용하면 자동으로 close를 호출하기때문에

더욱 편하게 사용이 가능하다

use에서의 인자는 한개이기 때문에 it으로 접근이 가능하여

더욱 간략하게 작성이 가능하다

 

- bufferedWriter

bufferedWrite의 사용법은 기본적으로 PrintWriter와 동일하다

하지만 내부적으로 bufferedWrite는 버퍼를 사용하기 때문에

데이터를 버퍼에 저장한 뒤 한번에 저장하여 더욱 효율적인 사용이 가능하다

'Kotlin' 카테고리의 다른 글

스레드  (0) 2020.08.29
I/O 입출력 (입력)  (0) 2020.08.16
DSL  (0) 2020.08.09
takeif() takeUnless()  (0) 2020.08.08
use함수  (0) 2020.08.02