[android(kotlin)] csv 파일 (이어)쓰기

깨미·2021년 5월 14일
0

📱 Android 📱

목록 보기
4/16
post-thumbnail
post-custom-banner

안드로이드에서 Ble 연결 후, 응답받은 패킷을 csv 파일에 쓰려고 한다.
csv 파일명은 연결됐을 때 date time으로 하고, 응답 받을 때 마다(onCharacteristicChanged) 해당 csv 파일에 byte를 write 할 수 있도록 한다.

1. onServicesDiscovered 에서 파일명으로 할 date time 지정.

 override fun onServicesDiscovered(gatt: BluetoothGatt?, status: Int) {
            super.onServicesDiscovered(gatt, status)
            time = SimpleDateFormat("yyyyMMdd_HH:mm:ss").format(Calendar.getInstance().time)
            ...
           
}

폴더 루트는 아래와 같다.
val path = Environment.getExternalStoragePublicDirectory("/Example")

2. onCharacteristicRead 에서 header 쓰기 (onCharacteristicRead는 Characteristic Read를 설정했을 시 호출되는 함수)

override fun onCharacteristicRead(
            gatt: BluetoothGatt?,
            characteristic: BluetoothGattCharacteristic,
            status: Int
        ) {
            super.onCharacteristicRead(gatt, characteristic, status)
            if (status == BluetoothGatt.GATT_SUCCESS) {
                csvFirst()
                ...
                
             }
          }
    fun csvFirst(){
        val headerData = "time,byte"
        val file = File(BleInfo.path, "$time.csv")
        val bw = BufferedWriter(FileWriter(file))
        try {
            bw.write("$headerData\n")
            bw.flush()
            bw.close()
        }
        catch (e: Exception) {
            Toast.makeText(this, "Error on writing file ${e.message}", Toast.LENGTH_LONG).show()
        }
    }

3. onCharacteristicChanged 에서 응답 받은 패킷 한 줄씩 csv 파일에 쓰기

        override fun onCharacteristicChanged(
            gatt: BluetoothGatt?,
            characteristic: BluetoothGattCharacteristic
        ) {
            super.onCharacteristicChanged(gatt, characteristic)

            csvSave(characteristic.value)
        }
    fun csvSave(data: ByteArray){
        val parTime = SimpleDateFormat("yyyyMMdd_HH:mm:ss").format(Calendar.getInstance().time)
        val file = File(BleInfo.path, "$time.csv")
        val bw = BufferedWriter(FileWriter(file, true))
        try {
            bw.write("$parTime,"+data.joinToString(",")+"\n")
            bw.flush()
            bw.close()
        }
        catch (e: Exception) {
            Toast.makeText(this, "Error on writing file ${e.message}", Toast.LENGTH_LONG).show()
        }
    }

BufferedWriter와 FileWriter를 사용하여 csv 파일을 쓴다.
이때 존재하는 파일이 있으면 이어 쓸 수 있도록 하였다. -> FileWriter(file, true)
또한, Array를 ,를 붙인 String으로 만들기 위해 joinToString(",")을 사용하였다.

추가사항

  1. 안드로이드에서 폴더 및 파일에 접근하려면 저장 공간 권한이 필요하다.
  2. csv 파일에 헤더를 쓰는 함수와 응답 받은 패킷을 쓰는 함수가 같아서 구분해서 같은 함수를 쓰는 것이 더 효율적일 듯 하다.
profile
vis ta vie
post-custom-banner

0개의 댓글