1. 파일 입출력

기존에 저장된 파일을 불러오는 방법은
  1. 내장메모리(스마트폰의 저장소)
  2. 외장메모리(SD카드의 저장소)
에서 불러 올수있습니다.

1-1. 통신 방식
먼저 Stream 방식은 데이터를 Byte단위로 통신하며
FileInputStream/FileOutputStream
BufferedInputStream/BufferedOutputStream
를 통해서 가능합니다.

다음으로 Reader,Writer 방식은 문자 단위로 통신을 하며
FileReader/FileWriter
BufferedReader/BufferedWriter
을 통해서 가능합니다.

위의 Stream과 Reader,Writer는 파일 입출력을 위한 통신뿐만 아니라 서버와의 통신에도
사용가능하니 후에 참고하시길 바랍니다.

1-2. 내장메모리 통신
이제 내장메모리의 파일을 입출력 하는것을 알아보겠습니다.
내장메모리는 안드로이드의 data/data/패키지에 데이터가 저장됩니다.
마시멜로우(6.0) 이후로는 보안문제로 접근이 힘듭니다만 가능은 합니다.
먼저 파일이 저장되는 경로는 getFileDir()을 통해 받아오실 수 있습니다.
또한 Cache file의 경우는 getCacheDir()을 통해서 가능하십니다.

try { BufferedWriter bw = new BufferedWriter( new FileWriter(getFilesDir() +"test.txt", true)); bw.write("들어갈 내용입니다."); bw.close(); } catch (IOException e) { e.printStackTrace(); }

먼저 파일을 쓰기위해서 BufferedWriter bw를 선언해줍니다.
그리고 bw.write를 통해 넣을 내용을 입력해주신후 bw.close로 닫아주시면 저장이됩니다.
주의할점은 반드시 try catch로 구현을 해야하며 사용해주시지 않으면 오류가 날것입니다.

try { BufferedReader br = new BufferedReader( new FileReader(getFilesDir() +"test.txt")); String readStr = ""; String str = null; while((str = br.readLine()) != null) readStr += str +"\n"; br.close(); Toast.makeText(this, readStr.substring(0, readStr.length()-1),Toast.LENGTH_SHORT).show(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }

다음으로는 읽기입니다.
getFilesdir()을 통해서 저장소 위치를 받아오고 파일이름을 붙임으로써 가져올 파일을 지정합니다.
그리하여 str으로 파일의 내용을 받아오신후
내용이 비어있는 지점까지 읽어오시면됩니다.

1-3. raw폴더 파일처리

raw폴더 파일처리는 안드로이드 스튜디오에서 res/raw폴더에
파일을 저장해주시고 읽어들이는 것입니다. 만약 없으시면 폴더를 만들어 주시면 됩니다.

getResources getResources().openRawResource openRawResource(R.raw.파일이름)

하여 위의 소스처럼 R.raw.파일이름으로 접근하셔서 가져오시면 됩니다.

1-4. 외장메모리 통신

외장메모리와의 통신에서 가장 중요한점은 반드시 권한을 받으셔야 합니다.
마시멜로우 미만 버전에서는 AndroidManifest.xml에 

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

만 입력해주시면 ?지만
마시멜로우부터는 별도의 권한을 받기 위한 코딩을 해 줘야 합니다.

다음으로 디렉토리(경로)를 만드실때는
String path =getExternalPath();
File file = new File(path + "디렉토리이름");
file.mkdir(); 즉 mkdir을 통해서 하시면 됩니다.

아래는 getExternalPath()의 일부 내용입니다.

String sdPath = ""; String ext = Environment.getExternalStorageState(); if(ext.equals(Environment.MEDIA_MOUNTED)) { sdPath =Environment.getExternalStorageDirectory().getAbsolutePath() + "/"; //sdPath = "/mnt/sdcard/";

외장 메모리의 주소는 위의 sdpath이며 위의 메소드들을 통해서 얻으실 수 있습니다.
경로를 제외한 write와 close는 내장메모리와 동일하니 따로 설명은 생략하겠습니다.

2. 실습 10

내장메모리에서 기존에 있던 데이터를 불러옵니다.
그리고 5월 21일 이라는 메모파일과 5월 21일이라는 내용으로 파일을 생성합니다.


5월 21일을 저장해서 리스트뷰에 추가되고 파일에도 추가됩니다.
물론 삭제도 가능합니다(롱아이템클릭리스너로 구현했습니다.)
하여 5월 19일을 삭제하여 2개만 남게되었습니다.

 

이제 5월 21일을 누르면 안의 내용이 나오고 수정으로 글씨가 바뀝니다.
그리하여 날짜를 바꾸고 수정을 하시면 기존의 21일은 삭제되고 20일만 남게됩니다.
만약 새로운 날짜를 등록할때 이미 그 날짜가 존재하면 중복 저장이 아닌 수정으로 넘어가게 됩니다.

저장소 주소
https://github.com/seon6565/File-Input-output

번호 제목 글쓴이 날짜 조회 수
128 PC를 위한 최고의 안드로이드 에뮬레이터 황제낙엽 2023.01.18 3132
127 [Jetpack Compose UI / 상추님] GDG Jetpack compose 코드랩 수료 후기 (feat. 굿즈) 황제낙엽 2022.12.24 2370
126 [Jetpack Compose UI / kyj1991719] compose - Compose 이해 황제낙엽 2022.12.24 4025
125 [Jetpack Compose UI / 꾸준] Compose 가 뭔데...? 황제낙엽 2022.12.24 4035
124 [Jetpack Compose UI / IIVIKI] Compose 학습과 분석 황제낙엽 2022.12.24 4050
123 [Jetpack Compose UI] 스터디 시작하기 황제낙엽 2022.12.24 4001
122 [개발하는 정대리] 취준생을 위한 안드로이드 앱만들기 - 바텀네비게이션 뷰, 네비게이션 AAC file 황제낙엽 2022.12.22 3882
121 [개발하는 정대리] 취준생을 위한 안드로이드 앱만들기 - 뷰바인딩 file 황제낙엽 2022.12.22 3850
120 [개발하는 정대리] 취준생을 위한 안드로이드 앱만들기 - 라이브데이터 뷰모델 file 황제낙엽 2022.12.21 3826
119 [대왕놀] ImageButton in Compose (IconButton) 황제낙엽 2022.12.20 4105
118 [대왕놀] compose instrumentation test tutorial 황제낙엽 2022.12.20 3985
117 [대왕놀] Switch in Compose 황제낙엽 2022.12.20 4106
116 [대왕놀] EditText in Compose (TextField) 황제낙엽 2022.12.20 4021
115 [대왕놀] margin in Compose 황제낙엽 2022.12.20 4105
114 [대왕놀] modifier in compose 황제낙엽 2022.12.20 4180
113 [대왕놀] Button in Compose file 황제낙엽 2022.12.20 4224
112 [대왕놀] TextView in Compose (Text) 황제낙엽 2022.12.20 4083
111 [대왕놀] ImageView in Compose (Image) 황제낙엽 2022.12.20 4017
110 [대왕놀] LinearLayout in Compose (Row, Column) 황제낙엽 2022.12.20 4113
109 [대왕놀] Introduction to Jetpack compose 황제낙엽 2022.12.20 3964