파일 입출력

Jiyoon Chae·2021년 6월 3일
0

안드로이드

목록 보기
1/23
  • 내부 저장소 , 외부 저장소 구분
  • 내부 저장소에서 파일의 입출력
  • SharedPreferences가 무엇인지 알고 어떻게 사용하는 지 실습
  • 앱이 구동하면서 이미지를 보여주는 것 : 파일의 출력
  • 메모장 등의 앱에 내용을 기록하는 것 : 파일의 입력

안드로이드는 리눅스 기반의 파일 시스템을 사용한다. 텍스트, 이미지, 음원, 영상 등의 파일을 읽고 쓸 수 있도록 파일 입출력 도구를 제공한다.

기기에 저장하는 것 = 입력, 사용자나 다른 기기에 전달하는 것 = 출력

  1. 저장소 종류와 권한

안드로이드는 리눅스 위에 가상 머신이 동작하는 플랫폼. 파일 시스템은 리눅스 사용.

리눅스 파일 시스템은 파일과 디렉터리에 대한 권한 설정 필요!!

설치된 앱 하나당 리눅스 사용자 아이디 + 디렉터리가 할당됨.

→각각의 디렉터리는 해당 사용자만 접근 가능!!

이렇게 특정 앱의 사용자가 접근할 수 있는 영역을 내부 저장소(internal Storage)라고 함.

모든 앱이 공용으로 사용할 수 있는 영역을 외부 저장소(external storage)

★안드로이드 Q부터는 보안 강화로 미디어 스토어를 통해서만 외부 저장소에 접근 가능!!

미디어스토어 (Media Store)는 외부 저장소에 저장되는 파일을 관리하는 데이터 베이스!!

내부 저장소(앱별 저장 공간)

: 설치한 앱에 제공되는 디렉터리. A앱을 설치하면 /data/data/A 디렉터리가 생성.

A앱이 해당 디렉터리의 소유주(owner)이므로 특별한 권한 없이 읽고 쓰기 가능.

내부 저장소에는 주로 내 앱에서만 사용하는 데이터 저장.

ex) 다이어리 앱은 다이어리 내용 등

외부 저장소(공유 저장 공간)

: 외부 저장소는 모든 앱이 함께 사용.

외부 저장소에 저장된 파일에 접근하려면 앱의 매니페스트에 권한을 명세해야함.

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

앱을 제거한 뒤에도 저장되어야하는 데이터를 저장 or 다른 앱도 접근할 수 있는 데이터.

외부 저장소를 사용하려면 사용자의 승인이 필요!

내부 저장소 파일 읽기

★파일 읽을 때 Text 파일이냐 아니냐에 따라 사용하는 API가 달라지므로 파일 형태를 알아야함

1. 파일 사용하기

  • 파일 정보를 사용하기 위해 File 클래스 먼저 생성. File은 파일 또는 디렉터리 경로를 생성자에 입력해서 생성할 수 있음.
val file= File("경로")
  • 다른 방법은 파일의 경로와 파일명을 입력해서 생성할 수 있음.

    파일 경로는 context가 가지고 있는 filesDir 프로퍼티를 통해 내부 저장소 files 디렉터리에 접근.

    이 경우, context를 상속받은 액티비티나 프래그먼트에서 바로 사용할 수 있어서 files라는 동일한 공간에 읽고 쓰기를 할 경우 이 방식이 좋음.

val file = File(baseContextl.filesDir, "파일명")

//액티비티의 경우 filesDir이 기본 프로퍼티임
val file = File(filesDir, "파일명")

File 클래스를 통해 생성된 파일 사용 예제

  • exists
if(file.exists()){  //파일의 존재여부 확인
	Log.d("File", "파일이 존재합니다")
}
  • isFile
if(file.isFile){  //File의 생성자에 전달된 경로가 파일인지를 확인!!
	Log.d("File", "파일이 입니다")
}
  • isDirectory
if(file.isDirectory){  //File의 생성자에 전달된 경로가 디렉토리인지를 확인!!
	Log.d("File", "디렉터리 입니다")
}
  • name
Log.d("File", "이 파일으 이름은 ${file.name}입니다") //생성된 파일 또는 디렉토리 이름 반환
  • createNewFile()
if(!file.exists()){
	file.createNewFile()
} //해당 경로에 파일이 존재하지 않으면 파일을 생성할 수 있음. exists와 함께 많이 사용.
  • mkdirs()
if(!file.exists()){
	file.mkdirs()
} // 디렉터리 생성, 생성하려믄 디렉토리 중간 경로도 함께 생성한다.
  • delete()
file.delete() 
//파일이나 디렉토리 삭제. 디렉토리의 경우 내부에 파일이 존재하면 삭제되지않는다.
  • absolutePath
Log.d("File", "이 파일(디렉토리)의 절대 경로는 ${file.absolutePath}입니다."

파일을 읽고 쓰는 스트림 Stream

파일의 실제 데이터를 읽고 쓰려면 stream이라는 복잡한 클래스 사용해야함.

스트림은 파일에 파이프를 하나 연결해 놓고 해당 파이프를 통해 데이터를 꺼내오는 방식.

파일의 크기를 특정할 수 없기 때문에 읽거나 쓸때만 파이프를 연결.

사용이 끝나면 파이프를 제거해야 컴퓨터를 효율적으로 사용할 수 있음.

스트림은 읽는 용도와 쓰는 용도가 구분되어 있다.

읽기 전용 스트림, 쓰기 전용 스트림 사용.

텍스트 파일 읽기

텍스트 파일 읽을 때는 Reader 계열의 스트림을 사용.

파일 경로를 파라미터로 전달 받아 파일 정보를 읽은 후 > 스트림 사용 > 파일 실제 데이터 읽기.

SharedPreferences

안드로이드 플랫폼의 간단한 데이터 저장 목적으로 제공하는 기능.

SharedPreferences는 내부 저장소를 이용하기 때문에 권한 설정이 필요없고 간단하다.

주로 로그인 정보나 앱의 상태 정보를 저장하는 용도로 사용!!

액티비티에서 인텐트에 값을 넣고 빼는 것과 비슷한 형태로 동작.

데이터를 키와 값 쌍으로 저장할 수 있다. 데이터는 xml 형식으로 된 파일로 저장되어 앱이 종료되어도 남아있음.

SharedPreferences 사용하기

<값을 저장할 때>

  1. SharedPreference 생성하기
  2. Editor 꺼내기
  3. putInt(), putString() 메서드로 저장하기
  4. apply() 로 파일에 반영하기

<값을 읽어올 때>

  1. SharedPreference 생성하기
  2. getInt(), getString() 메서드로 값 읽어오기

1.SharedPreference 생성하기

  • getSharedPreferences()

:Context를 가지고 있는 모든 컴포넌트에서 접근, 호출 가능.

val shared = getSharedPreferences("이름", Context.MODE_PRIVATE) 
//액티비티에서 이렇게 호출하면 SharedPreferences가 반환됨.
  • getpreferences()

: 개별 액티비티에서 사용하거나 액티비티가 하나밖에 없는 앱이라면 이걸 호출.

var preference = getPreferences(Context.MODE_PRIVATE)
  1. Editor로 데이터를 저장하고 불러오기
profile
바닐라라떼 좋아☕

0개의 댓글