본문 바로가기
안드로이드(android)

Android(Kotlin) / 파일입출력(내부 저장소, 외부저장소)

by clean_h 2021. 1. 28.
728x90

파일 입출력


안드로이드 저장소

안드로이드는 파일 데이터를 저장할 수 있는 저장소를 내부저장소, 외부 저장소 두 가지로 구분한다.

일반적으로 내부 저장소는 안드로이드 기기 자체에서 제공하는 비휘발성 내부 메모리를 말하고 외부 저장소는 마이크로 SD카드와 같은 이동식 저장소를 말한다.

 

  • 내부 저장소

  • 외부 저장소

내부 저장소 (internal storage) 외부 저장소 (external storage)
애플리케이션을 통해서만 접근이 가능 단말기 내부의 공유 영역으로 모든 애플리케이션이 접근 가능
애플리케이션이 삭제되면 저장소도 같이 삭제 애플리케이션이 삭제되어도 저장소는 삭제되지 않음
사용자와 다른 앱이 자신의 파일에 액세스하는 것을 원치 않을 경우 적합 액세스가 제한이 필요하지 않거나 다른 앱과 공유하고 싶은 파일을 다룰 때 적합
openFileoutput, openFileInput으로 접근 FileInputStream, FileOutputStream으로 접근

 

 

 

내부 저장소  파일 입출력


//파일 저장//

var output = openFileOutput("파일이름", Context.MODE_PRIVATE) //MODE_APPEND : 뒤에 추가, MODE_PRIVATE : 덮어쓰기
var dos = DataOutputStream(output)

dos.writeInt(123)               //정수형 type
dos.writeDouble(12.34)          //실수형 type
dos.writeUTF("안녕하세요")      //문자형 type
dos.flush()
dos.close()

Open할 형태

  • MODE_APPEND : 뒤에 추가
  • MODE_PRIVATE : 덮어쓰기

flush는 stream에 남아 잇는 데이터를 강제로 내보내는 역할이다. 그래서 close()하기 전에 해주는 것이 좋다. 

 

//파일 읽기//

var input = openFileInput("파일이름")
var dis = DataInputStream(input)

var valueInt = dis.readInt()           //정수형 type
var valueDouble = dis.readDouble()     //실수형 type
var valueUTF = dis.readUTF()           //문자형 type
dis.close() //종료

//이후 valueInt, valueDouble, valueUTF 출력할 수 있다.

 

 

외부 저장소 파일 입출력


외부 저장소를 접근하기 위해서는 권한이 필요하다.

 

AndroidManifest.xml에 다음과 같은 권한을  추가해준다.

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!--파일을 읽고 쓰기 위해 권한을 추가, 외부저장소를 사용할떄 필요-->

 

권한 확인작업을 해줘야한다. 

//권한 리스트
var permission_list = arrayOf(
	Manifest.permission.READ_EXTERNAL_STORAGE,
    Manifest.permission.WRITE_EXTERNAL_STORAGE
)

//권한 체크
fun PermissionCheck(){
	if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M){
		return
    }
    for(permission : String in permission_list){
    	var chk = checkCallingOrSelfPermission(permission)
        if(chk == PackageManager.PERMISSION_DENIED){
        	requestPermissions(permission_list, 0)
            break
        }
    }
}

var path : String? = null  //파일 경로

override fun onCreate(savedInstanceState: Bundle?) {
 	super.onCreate(savedInstanceState)
	setContentView(R.layout.activity_main)
        
	path = Environment.getExternalStorageDiretory().absolutePath + "/android/data/" + packageName
		
	var file = FIle(path)
	if(file.exist() == false){
	file.mkdir()
	}
    
}

 

Environment.getExternalStorageDiretory().absolutePath  // 외부 저장소까지의 경로를 얻어올 수 있다.

 

path에 파일을 저장할 경로를 만들어 주었다.

 

//파일 저장//

var output = FileOutputStream(path + "/sdkfile")
var dos = DataOutputStream(output)

dos.writeUTF("확인")
dos.flush()
dos.close()

flush는 stream에 남아 잇는 데이터를 강제로 내보내는 역할이다. 그래서 close()하기 전에 해주는 것이 좋다. 

 

 

//파일 읽기

var input = FileInputStream(path + "/sdkfile")
var dis = DataInputStream(input)

var valueUTF = dis.readUTF()
dis.close()

//이후 파일 출력

정리

안드로이드는 외부 저장소와 내부 저장소를 제공하고 있다.

외부 저장소 및 내부 저장소 모두 파일 입출력이 가능하다.

 

참고

www.youtube.com/watch?v=qRVE566kXzc&t=1031s

www.youtube.com/watch?v=XDD1gqrjfr0 

underground2.tistory.com/39 

728x90

댓글