Hello, Android!
I/O 입출력 (출력) 본문
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 |