297
No
class SdcardActivity
package com.example.choi.ex04_file;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
public class SdcardActivity extends AppCompatActivity {
//1.변수 선언
Button btnSave, btnLoad, btnDelete;
EditText edit1;
String path; //sdcard 의 경로
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.read_write);
//2. 위젯 연결
btnSave=(Button)findViewById(R.id.btnSave);
btnLoad=(Button)findViewById(R.id.btnLoad);
btnDelete=(Button)findViewById(R.id.btnDelete);
edit1=(EditText)findViewById(R.id.edit1);
//sdcard의 절대 경로(안드로이드 버전, 제조사마다 디렉토리가 다름)
path = Environment.getExternalStorageDirectory().getAbsolutePath();
//아래 처럼 절대 경로로 하면 안된다. 기기만다 다르기 때문에 위처럼 해야 한다.
//path="/storage/emulated/0/";
//3. 저장 버튼 클릭
btnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
check();
}
});
//4. 불러 오기 버튼 클릭
btnLoad.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
load();
}
});
//5. 삭제 버튼 클릭
btnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
File file =new File(path+"/test.txt");
//파일 .delete() 파일 삭제, 성공하면 true, 실패하면 false
if(file.delete()){
edit1.setText("");
Toast.makeText(SdcardActivity.this, "삭제 되었습니다.",
Toast.LENGTH_SHORT).show();
}
}
});
}
void load(){
try{
//스트림(바이트단위 입출력)
FileInputStream is =
new FileInputStream(path+"/test.txt");
if(is!=null){
//Reader, Writer : 문자 단위 입출력력
InputStreamReader reader =new InputStreamReader(
is, "utf-8");
//버퍼를 사용한 입출력(빠른 처리 가능)
BufferedReader br =new BufferedReader(reader);
String str="";
StringBuffer sb =new StringBuffer();
while ((str=br.readLine())!=null){
sb.append(str+"\n");
}
is.close();
edit1.setText(sb.toString());
}
}catch (Exception e){
e.printStackTrace();
}
}
//사용권한 체크 (Minimum SDK vesrion 을 23 으로 설정 )
void check(){
//권한 검사(AndroidManifest.xml) , 사용자의 동의 여부
if(checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED ||
checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED
)
{
//권한 설정이 왜 필요한지 사용자에게 안내문 출력(선택적인 옵션)
if(shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)){
Toast.makeText(this, "외부메모리에 읽기/쓰기 권한이 필요합니다.", Toast.LENGTH_LONG).show();
}
//팝업
//requestPermissions("사용권한 배열", 요청코드)
// 요청코드는 임의의 값 사용 가능
requestPermissions(new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}else{
// 동의한 상태 => save()
save();
}
// 동의하지 않은 상태
//팝업
}
//사용자의 사용권한 동의 여부가 전달
//int requestCode - 요청코드
//String[] permissions - 요청권한 배열
//int[] grantResults - 권한 수락 여부 배열
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 1: //요청코드
if(grantResults.length > 0 &&
grantResults[0]==PackageManager.PERMISSION_GRANTED &&
grantResults[1]==PackageManager.PERMISSION_GRANTED
){
save();
}else{
Toast.makeText(this, "더이상 외부메모리를 사용할 수 없습니다.",
Toast.LENGTH_LONG).show();
}
}
}
void save(){
//외부메모리의 경로 내장 메모리 저장할 때의 코드작성과 같다. 차이는 path
File file=new File(path+"/test.txt");
try{
FileOutputStream fos =new FileOutputStream(file);
String str =edit1.getText().toString();
fos.write(str.getBytes());
fos.close();//스트림 닫기
Toast.makeText(this, "저장되었습니다.", Toast.LENGTH_LONG).show();
}catch (Exception e){
e.printStackTrace();
}
}
}
read_write.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/read_write"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.choi.ex04_file.ReadWriteActivity">
<Button
android:text="저장"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:id="@+id/btnSave" />
<Button
android:text="불러오기"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:id="@+id/btnLoad" />
<Button
android:text="삭제"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:id="@+id/btnDelete" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="textMultiLine"
android:ems="10"
android:id="@+id/edit1"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentBottom="true"
android:layout_below="@+id/btnSave" />
</RelativeLayout>
댓글 ( 4)
댓글 남기기