Language/Kotlin

Kotlin 파일 입출력 (io/nio)

728x90
반응형

표준 입출력의 기본 개념

가장 기본적인 표준 입출력 API

  •  readLine()
  • val input = readLine()!!
  •  Scanner()
  • val input1 = Scanner(System.'in').readr.nextInt() // 정수형으로 입력 받음 val input2 = Scanner(System.'in').readr.nextLong() // Long타입으로 입력 받음 val input3 = Scanner(System.'in').readr.nextFloat() // Float타입으로 입력 받음 val input4 = Scanner(System.'in').readr.nextDouble() // Double타입으로 입력 받음 val input5 = Scanner(System.'in').readr.nextBoolean() // Boolean타입으로 입력 받음 val input5 = Scanner(System.'in').readr.nextLine() // 문자열로 입력 받음

Kotlin의 입출력 API

kotlin.io패키지는 다음 자바의 java.io 라이브러리를 확장한 것 임

io 패키지 처리 목적
java.io.File 파일 처리
java.io.InputStream 바이트 단위의 칩력 처리
java.io.OutputStream 바이트 단위의 출력 처리
java.io.Reader 문자 기반 읽기 처리
java.io.Writer 문자 기반 쓰기 처리
java.io.BufferedReadr 버퍼를 가진 읽기처리

이러한 라이브러리는 파일이나 콘솔과 같은 스트림(stream)에서 읽거나 쓸수 있는 api를 제공한다. 

데이터 양에따라 간단한 데이터는 readLine()과 같은 함수를 쓰면되지만, 대량의 데이터는 forEachLine()과 같은 API를 써야한다.

InputStram, 

 

 

자바의 io, nio의 개념

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

nio패키지의 구성

nio 패키지 포함되어 있는 내용
java.nio 다양한 버퍼 클래스
java.nio.channels 파일 채널, TCP/UDP 채널 등 
java.nio.charset 문자 세트, 인코더, 디코더 등 
java.nio.file 파일 및 파일 시스템 접근 클래스 

1) 스트림(Stream) vs 채널(Channel)

  • 스트림(Stream) : 데이터가 흘러가는 방향성에 따라 입력스트림(inputStream)과 출력 스트림(outputStream)으로 구분됩니다. 데이터를 읽고 저장하는 양방향성을 가지는 작업을 할때 예를들어 파일의 경우 FileInputStream과 FileOutputStream 으로 두 작업을 별도로 지정해야 합니다. 
  • 채널(Channel) : 양방향으로 입력과 출력이 모두 가능하기 때문에 입출력을 별도로 지정하지 않아도 됩니다. 여러개의 수로를 가진다고 비유할수 있습니다. 예를들어 파일의 경우 FileCannel을 생성하면 입력과 출력을 동시에 사용할 수 있게됩니다. 

2) 넌버퍼 (Non-buffer) vs 버퍼(Buffer)

  • 넌버퍼(Non-buffer) : 스트림방식에서는 1바이트를 쓰면 입력스트림이 1바이트를 읽습니다. 버퍼를 사용해 다수의 데이터를 읽는것보다 상당히 느리게 동작합니다. 그래서 io에서도 버퍼와 병합해 사용하는 BufferedInputStream과 BufferOutputStream을 제공하기도 합니다. 
  • 버퍼(Buffer) : nio에서는 기본적으로 버퍼를 사용하는 입출력을 하기 때문에 데이터를 일일히 읽는것 보다 더 좋은 성능을 보입니다.

3) 블로킹(Blocking) vs 넌블로킹(Non-blacking)

  • 블로킹 : 프로그램에서 쓰려고 하는데 공간이 채워져있기때문에 쓰지 못하고, 읽으려해도 채워져 있지 않아서 읽을 수 없을때 메인코드 업무흐름이 중단(블로킹)됨
  • 넌블로킹 : 메인코드의 흐름을 방해하지 않도록 입출력 작업 시 스레드나 비동기 루틴에 맡겨 별개의 흐름으로 작업하여 블로킹 되지 않는다

 

파일에 쓰기

Files 클래스

file클래스는 java.nio.file에 속해있으며 파일 조작을 위한 각종 static 메서드로 구성되어있습니다.

 

Files의 Write()사용하기

fun main( ) {
	val path = "D:\\test\\hello.txt"
    val text = "hi! Hello World!\n"
    
    try{
    	Files.write(Paths.get(path), text.toByteArray(), StandardOption.CREATE)
    }catch(e: IOException){
    }
}

파일 경로는 Paths클래스를 사용한다. 

파일 생성시 사용하는 주요 옵션은 StandardOpenOption이다.

READ(읽기용으로 연다), WRITE(파일을 쓰기용으로 연다), APPEND(파일이 존재하면 마지막에 추가한다), CREATE(파일이 없으면 새 파일을 생성한다) 

 

 

File의 PrintWriter() 사용하기

 

File의 BufferedWriter() 사용하기

 

File의 writeText() 사용하기

 

File의 Writer 사용하기

 

 

파일에서 읽기

File의 FileReader() 사용하기

 

 

자바의 파일읽기를 코틀린으로 변경하기 (@@@)

 

 

 

 

728x90
반응형