본문 바로가기
Development/Free Topic

안드로이드 파일 입출력, 경로, 모드 / 네트워크 통신

by IMCOMKING 2014. 6. 10.

# 루트 디렉토리 접근 및 제어

기본적으로 안드로이드의 data/data 폴더는 루팅을 해야만 접근이 가능하다.


특히 구글 글래스를 USB로 연결해보면 internal storage에 DCIM이랑 Pictures 폴더밖에 없다. 개발자용이 아니라 adb를 이용해야만 디렉토리에 접근이 가능하다고 한다.


1) 경로 탐색

adb shell 로 접속한다음 ls 등의 리눅스 명령어를 통해 탐색.


1-1) 여러개의 안드로이드를 연결했을 때,

adb devices; //연결된 안드로이드의 ID리스트 출력

adb -s [ID] shell;


2) 파일 가져오기

adb pull /storage/sdcard0/AutoRecorder/test.txt test.txt



- 파일 전송 http://androidforums.com/eris-all-things-root/185671-access-root-files-pc.html

http://www.herongyang.com/Android/adb-push-and-pull-Command.html

다양한 adb 명령어 : http://wampa.tistory.com/23




- 안드로이드를 PC와 연결했을 때, 디렉토리 새로고침 하는 함수.

<protected-broadcast android:name="android.intent.action.MEDIA_MOUNTED" />


public void refreshSD() {

//sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://"+Environment.getExternalStorageDirectory()+ File.separator + "DCIM/Camera/")));

//이방법은 4.4 버전이후로 안된다고 한다..


  MediaScannerConnection.scanFile(this, new String[] { Environment.getExternalStorageDirectory().toString() }, null, new MediaScannerConnection.OnScanCompletedListener() {

      /*

       *   (non-Javadoc)

       * @see android.media.MediaScannerConnection.OnScanCompletedListener#onScanCompleted(java.lang.String, android.net.Uri)

       */

      public void onScanCompleted(String path, Uri uri) 

        {

            Log.i("ExternalStorage", "Scanned " + path + ":");

            Log.i("ExternalStorage", "-> uri=" + uri);

        }

      });

}


MainActivity의 onCreate나 onDestroy 에서 실행해주면 편하다.



# 안드로이드 경로


1) Environment.getExternalStorageDirectory();

/storage/emulated/0/  (=/storage/sdcard0 =/sdcard 셋다 모두 동일한 경로를 가리킨다. 맨 처음 경로를 사용하자.)

(보통 이것만 있으면 충분하다.)

String filePath = Environment.getExternalStorageDirectory()+File.separator+"DCIM/Camera/Pic_"+timeStamp+".jpg";

2) Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
/storage/emulated/0/DCIM
(DIRECTORY_PICTURES 대신 여러가지 미리 지정된 경로가 올 수 있다.)

3) this.getExternalFilesDir(Environment.DIRECTORY_DCIM);
/storage/emulated/0/Android/data/패키지명/files/DCIM

4) Environment.getDataDirectory();
/data

5) Environment.getRootDirectory();
/system

6) Environment.getDownloadCacheDirectory();
/cache


http://developer.android.com/reference/android/os/Environment.html#getExternalStoragePublicDirectory(java.lang.String)



# 파일 생성 및 입출력
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE> 을 일단 추가한다.

File file = new File(path); 를 한다고 해서 바로 파일이 생성되는 것이 아니다. 그냥 그 directory를 가진 어떤 객체가 생길 뿐이다. 따라서 file을 이용해 폴더를 만들 수도 있고, 임의의 파일을 생성할 수도 있다.


1) 지정한 디렉토리를 생성한다.
File file = new File(Environment.getExternalStorageDirectory()+"/Temp");
file.mkdir();

2) 빈 껍데기 파일을 생성한다.(파일 출력을 위해서는 생성한 파일을 다시 Stream으로 열어야한다.)
File file = new File(Environment.getExternalStorageDirectory()+"/Temp/test.txt");
file.createNewFile();

FileOutputStream outputStream = openFileOutput("파일명", Context.MODE_PRIVATE);
outputStream.write("Hello".getBytes());
outputStream.close();// Stream류는 가비지 컬랙트를 하지않아, close를 안해주면 메모리 릭이 발생할 수 있다.
위 방법은 어플리케이션에 기본으로 지정된 경로에 대해서만 접근가능해 매우 불편하다. 비추천.

3) 파일 생성 및 문자열 출력이 동시에 가능한 BufferedWriter를 생성한다.
BufferedWriter buf = new BufferedWriter(new FileWriter("경로/파일명.확장자",true)); // false로하면 append가 안된다.
buf.write("Hello");
buf.close();



- mode  = MODE_PRIVATE  : 혼자만 사용하는 모드
          = MODE_APPEND  : 파일이 존재할 경우 기존내용에 추가하는 모드
          = MODE_WORLD_READABLE : 다른 응용 프로그램과 파일 읽을 수 있음
          = MODE_WORLD_WRITABLE  : 다른 응용 프로그램이 파일 기록할 수 있음


- 입출력


입출력에는 다음과 같은 카테고리가 있다.

1) Buffered 가 붙은것과 안붙은 것 : Buffered가 붙으면 버퍼가 찰때마다 바로바로 입출력을 해서 성능이 훨씬 빠르단다.

2) InputStream, OutputStream :  ByteStream을 입출력하는 것

3) Write, Reader : 텍스용 입출력 함수(2번을 이용해서 Write와 Reader를 구현한듯하다.)



내가 사용한 예제 코드이다.


       File mfile1 = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "test1.txt");


       FileWriter mfw= null;

       BufferedWriter bfw = null;

      

       boolean www = mfile1.createNewFile();


       byte[] buffer = new byte[1024]; // buffer store for the stream

         int bytes; // bytes returned from read()

                    mfw = new FileWriter(mfile1, true);

                    bfw = new BufferedWriter(mfw);

                    bfw.append(bytes2String(buffer, bytes));

                    bfw.close();

                    mfw.close();


      



* 안드로이드 파일 Write 할때 주의점

아주 간단한 사실인데 이것 때문에 엄청나게 고생했다.

안드로이드 내부 sd 카드에 새로운 파일을 생성하는 경우, usb를 뺏다가 다시 꽂아야만 그 파일을 PC에서 확인할 수 있다... 즉 새로고침이 작동하지 않는다...



http://blog.naver.com/PostView.nhn?blogId=slrkanjsepdi&logNo=90140711064



- CSV 입출력

opencsv 라이브러리로 매우 간단히 구현 가능하다.


opencsv-3.0.jar


#참고 : String split 시, "."은 "\\."으로 입력해야한다.


http://www.codeproject.com/Questions/491823/Read-fWriteplusCSVplusinplusplusAndroid



- 네트워크 통신


http://www.coderzheaven.com/2012/03/29/uploading-audio-video-or-image-files-from-android-to-server/


'Development > Free Topic' 카테고리의 다른 글

디자인 패턴(Design Pattern)  (0) 2014.06.11
안드로이드 여러가지 트러블 슈팅  (0) 2014.06.10
[톰캣] 리눅스 톰캣 재시작  (0) 2014.05.18
[HTML] onsubmit  (0) 2014.05.18
세션 한글 정보 처리  (0) 2014.05.13

댓글