• 사용 의의

    • File은 컴퓨터에서 데이터를 저장하는 기본 단위이다.
    • 텍스트, 이미지, 오디오, 비디오 등 다양한 형태의 데이터를 저장하고 관리하는 것이 가능하다.
    • 실무에서는 이미지 파일 업로드, UART 수신 데이터 파일 기록, BLE 원시 바이트 데이터 파일 기록 등 활용도가 상당히 높았던 관계로 파일 입출력과 관련된 내용을 간단하게 정리하고자 한다.
    • (하단의 입출력 예시는 Kotlin 기준으로 작성되었음에 유의)
  • InputStream & OutputStream

    • 바이트 단위의 데이터를 입출력하기 위해 사용된다.
    • 후술할 구현체들을 사용해 파일의 입출력을 처리한다.
  • FileInputStream & FileOutputStream

    • 데이터의 입출력을 바이트 단위로 수행한다.

      • Kotlin 확장 함수인 use 함수를 사용해 입출력이 끝난 Closeable 객체를 자동으로 닫을 수 있으니 참고
    • FileOutputStream(file)은 쓰기 작업을 수행할 파일이 존재하지 않을 경우 새 파일을 생성한다.

      • 이미 존재하는 파일에 write 작업을 수행할 경우 수행되는 디폴트 작업은 덮어쓰기(overwrite)이다.
      • 이어쓰기(append)를 원할 경우, FileOutputStream의 두 번째 인자인 append 플래그를 활성화해야 한다.
    • 한 번에 많은 양의 데이터에 대해 입출력을 수행할 경우, 메모리 부족 이슈가 발생할 수 있음에 주의한다.

      • 이러한 문제를 해결하기 위해 후술할 BufferedInputStream, BufferedOutputStream을 사용한다.
    • 예시

      1.png

      2.png

  • BufferedFileInputStream & BufferedFileOutputStream

    • FileInputStream, FileOutputStream에 버퍼의 개념을 추가한 구현체

    • 데이터를 일시적으로 버퍼에 저장하여 입출력을 수행하는 방식으로 성능을 향상시킨다.

      • 원한다면 버퍼의 크기를 임의로 조절할 수도 있다.
    • 예시

      3.png

      4.png

  • 확장자

    • 파일의 공유 대상 및 공유 목적에 따라 결정된다.
      • 일반 사용자에게 이미지 데이터를 공유 목적으로 사용하는 대표적인 확장자로 jpg, png 등이 있다.
      • 이는 해당 파일이 어떤 데이터 정보를 포함하는지를 알려준다.
    • 확장자가 필요하지 않을 수 있다.
      • 내부적으로 처리해야 하는 원시 데이터의 경우가 그렇다.
      • 사용자와 직접적인 상호작용이 필요 없는 바이너리 파일, 로그 파일 등이 그렇다.
      • log, data 등의 확장자를 쓰기도 하지만 반드시 필요한 것은 아니다.
    • 확장자의 존재 여부와 상관 없이 모든 파일은 데이터를 바이트 시퀀스로 저장한다.
      • 파일 형식에 따라 바이트를 해석하는 방식이 달라질 뿐이다.
  • 파일 유형 별 데이터 구조

    • (같은 유형의 데이터라 하더라도 데이터 형태는 확장자 별로 천차 만별이니 개략적으로만 참고할 것)
    • text
      • 텍스트를 문자 인코딩 규칙에 따라 바이트로 변환하여 저장한다.
      • 디폴트로 UTF-8 인코딩이 적용된다.
      • ex) txt
    • image
      • 시각적인 정보를 재구성하는데 필요한 데이터를 저장한다.
      • 헤더(이미지 포맷 정보, 압축 방식, 해상도, 색상 깊이 등), 이미지 데이터(압축된 픽셀 정보), 메타 데이터(형식, 해상도, 카메라 모델, 날짜, 시간 등) 등이 저장된다.
      • ex) jpg
    • audio
      • 아날로그로 존재하는 오디오 신호를 (샘플링을 통해) 디지털 데이터로 변환하여 저장한다.
      • 헤더(오디오 포맷 정보, 샘플레이트, 비트레이트, 압축 방식 등), 오디오 데이터(압축된 오디오 정보), 메타 데이터(형식, 해상도, 카메라 모델, 날짜, 시간 등) 등이 저장된다.
      • ex) mp3
    • video
      • 이미지와 오디오 데이터 모두를 저장한다.
      • 헤더(비디오 포맷 정보, 코덱 정보, 비트레이트, 해상도, 프레임 레이트, 채널 수, 샘플링 레이트 등), 영상 데이터(각 프레임의 이미지 데이터), 오디오 데이터, 메타 데이터(제목, 제작 연도, 자막 정보, 프레임 간 시간 정보 등)
      • ex) mp4