안 드 로 이 드 핸드폰 저장 매체 대전

11728 단어 android기초 지식
자주 사용 하 는 5 개의 저장 방식 을 알 고 있 습 니 다:
    1.File I/O
    2.SQLite
    3.Preferences
    4.Content provider
    5.     

본 고 는 응용 프로그램 에서 기본 적 인 파일 관련 임 무 를 수행 하 는 방법 을 소개 합 니 다.
Linux 파일 시스템 의 기본 지식 과http://java.io 표준 파일 입 출력 API 입 니 다.
내부 또는 외부 저장 소 를 선택 하 십시오. 모든 Android 장치 에는 두 개의 파일 저장 영역 이 있 습 니 다.
내부 와 외부 저장 소.
이 이름 들 은 Android 초기 에 생 성 되 었 습 니 다. 그 당시 대부분의 장 치 는 내 장 된 비 휘발 성 메모리 (내부 저장) 와 모 바 일 저장 소 를 제공 합 니 다.
예 를 들 어 마이크로 SD 카드 (외부 저장 소).일부 장 치 는 영구적 인 저장 공간 을 '내부' 와 '외부' 구역 으로 나 누 는데 모 바 일 저장 매체 가 없 더 라 도 항상 두 개의 저장 공간 이 있 고 외부 저장 장치 가 이동 할 수 있 든 없 든 API 의 행 위 는 일치 합 니 다.
아래 목록 은 각 저장 공간 에 대한 실제 정 보 를 모 았 다.
내부 저장 소:
그것 은 시종 사용 할 수 있다.이 곳 에 저 장 된 파일 에 접근 할 수 있 는 응용 프로그램 만 있 습 니 다.사용자 가 응용 프로그램 을 마 운 트 해제 할 때 시스템 은 내부 저장 소 에서 응용 프로그램의 모든 파일 을 제거 합 니 다.사용자 나 다른 응용 프로그램 이 파일 에 접근 할 수 없 도록 하려 면 내부 저장 소 가 가장 좋 은 선택 입 니 다.
외부 저장 소:
사용자 가 외부 저장 소 를 USB 저장 장치 로 불 러 올 수 있 고 어떤 경우 에는 장치 에서 제거 할 수 있 기 때문에 항상 사용 할 수 있 는 것 이 아 닙 니 다.전역 적 으로 읽 을 수 있 기 때문에 저 장 된 파일 은 제어 되 지 않 고 읽 힐 수 있 습 니 다.
사용자 가 응용 프로그램 을 마 운 트 해제 할 때 getExternalFilesDir () api 를 통 해 가 져 온 저장 경 로 를 사용 하고 응용 파일 을 디 렉 터 리 에 저장 할 때 시스템 에서 응용 파일 을 제거 합 니 다.getExternalStorage PublicDirectory () api 를 통 해 가 져 온 저장 경 로 는 apk 가 제거 되 더 라 도 파일 은 외부 저장 소 에 저 장 됩 니 다.접근 제한 이 없 거나 다른 응용 프로그램 과 공유 하거나 사용자 가 컴퓨터 로 접근 할 수 있 도록 허용 하 는 파일 에 대해 외부 저장 소 는 가장 좋 은 위치 입 니 다.
주: Android N 이전에 내부 파일 은 파일 시스템 권한 을 완화 하여 다른 응용 프로그램 에 접근 할 수 있 습 니 다.지금 은 더 이상 이런 상황 이 아니다.다른 응용 프로그램 이 개인 파일 의 내용 에 접근 하 기 를 원한 다 면, 응용 프로그램 은 FileProvider 를 사용 할 수 있 습 니 다.
알림:
기본 값 으로 내부 저장 소 에 설치 되 어 있 지만 목록 파일 에 속성 android:installLocation 을 지정 하면 외부 저장 소 에 설치 할 수 있 습 니 다.APK 가 매우 크 고 외부 저장 공간 이 내부 저장 공간 보다 클 때 사용 자 는 이 선택 을 더욱 선 호한 다.자세 한 정 보 를 알 고 싶 으 시 면 설치 위 치 를 참조 하 십시오.
외부 에 저 장 된 정 보 를 외부 에 저장 할 수 있 는 권한 을 가 져 옵 니 다. 목록 파일 에 WRITE 를 요청 해 야 합 니 다.EXTERNAL_STORAGE 권한.
주의:
현재 모든 응용 프로그램 은 외부 저장 소 를 읽 을 수 있 으 며 특별한 권한 이 필요 하지 않 습 니 다.하지만 이 는 앞으로 버 전에 서 변 경 될 것 이다.응용 프로그램 이 외부 저장 소 를 읽 어야 한다 면 (정 보 를 쓰 지 않 지만) READ 를 설명해 야 합 니 다.EXTERNAL_STORAGE 권한.
응용 프로그램 이 계속 정상적으로 작 동 하 는 지 확인 하려 면 변경 사항 이 적용 되 기 전에 이 권한 을 설명해 야 합 니 다.내부 저장 소 에 파일 을 저장 하고 내부 저장 소 에 파일 을 저장 할 때 다음 두 가지 방법 중 하 나 를 호출 하여 File 의 해당 디 렉 터 리 를 가 져 올 수 있 습 니 다.
1.getFilesDir()
응용 프로그램의 내부 디 렉 터 리 를 표시 하 는 File 을 되 돌려 줍 니 다.
2.getCacheDir()
임시 캐 시 파일 을 사용 하 는 내부 디 렉 터 리 를 표시 하 는 File 을 되 돌려 줍 니 다.
필요 하지 않 은 모든 파일 을 삭제 하고 지 정 된 시간 에 사용 할 메모리 의 크기 를 합 리 적 으로 제한 해 야 합 니 다. 예 를 들 어 1MB.
시스템 이 저장 소 를 다 소모 할 경우 경고 없 이 캐 시 파일 을 삭제 합 니 다.이 디 렉 터 리 중 하나 에 새 파일 을 만 들 려 면
1. File () 구조 함 수 를 사용 하여 내부 저장 디 렉 터 리 를 지정 한 상기 방법 중 하나 인 File 을 전달 할 수 있 습 니 다.예 를 들 어: File file = new File (context. getFilesDir (), filename);
2. 또는 openFileOutput () 을 호출 하여 내부 디 렉 터 리 에 기 록 된 파일 의 FileOutputStream 을 가 져 올 수 있 습 니 다.예 를 들 어 파일 에 텍스트 를 쓰 는 방법 을 보 여 줍 니 다.
String filename = "myfile";
String string = "Hello world!";
FileOutputStream outputStream;

try {
  outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
  outputStream.write(string.getBytes());
  outputStream.close();
} catch (Exception e) {
  e.printStackTrace();
}

3. 또는 일부 파일 을 캐 시 하려 면 createTempFile () 을 사용 해 야 합 니 다.예 를 들 어 다음 방법 은 URL 에서 파일 이름 을 추출 하고 사용 중인 내부 캐 시 디 렉 터 리 에서 이 이름 으로 파일 을 만 드 는 것 입 니 다.
public File getTempFile(Context context, String url) {
    File file;
    try {
        String fileName = Uri.parse(url).getLastPathSegment();
        file = File.createTempFile(fileName, null, context.getCacheDir());
    } catch (IOException e) {
        // Error while creating file
    }
    return file;
}

주:
응용 프로그램의 내부 저장 장치 디 렉 터 리 는 Android 파일 시스템 의 특정 위치 에 적용 되 는 패키지 이름 으로 지 정 됩 니 다.
기술적 으로 파일 모드 를 읽 을 수 있 도록 설정 하면 다른 응용 프로그램 에서 도 내부 파일 을 읽 을 수 있 습 니 다.그러나 이 응용 프로그램 도 응용 프로그램의 패키지 이름과 파일 이름 을 알 아야 합 니 다.다른 응용 프로그램 은 내부 디 렉 터 리 를 탐색 할 수 없고 읽 기와 쓰기 권한 이 없습니다. 파일 을 읽 을 수 있 거나 쓸 수 있 는 것 으로 설정 하지 않 는 한.
내부 에 저 장 된 파일 에 MODE 를 사용 하기 만 하면PRIVATE, 다른 응용 프로그램 은 접근 하지 않 습 니 다.외부 저장 소 에 파일 저장 외부 저장 소 를 사용 할 수 없 기 때문에
- 예 를 들 어 사용자 가 컴퓨터 에 저장 하거나 외부 에 저 장 된 SD 카드 를 제 거 했 을 때 - 따라서 방문 하기 전에 용량 을 항상 확인 해 야 합 니 다.getExternalStorageState () 를 호출 하여 외부 저장 상 태 를 조회 할 수 있 습 니 다.돌아 온 상태 가 MEDIA 이면MOUNTED, 그러면 파일 을 읽 고 쓸 수 있 습 니 다.예 를 들 어 다음 과 같은 방법 은 저장 의 가용성 을 확인 하 는 데 매우 유용 하 다.
/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
 return true;
    }
 return false;
}
/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state) ||
        Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
 return true;
    }
 return false;
}

외부 저장 소 는 사용자 와 다른 응용 프로그램 에서 수정 할 수 있 지만 두 가지 파일 을 저장 할 수 있 습 니 다.
공공 파일 은 다른 응용 프로그램 과 사용자 가 자 유 롭 게 사용 할 수 있 도록 제공 해 야 한다.사용자 가 응용 프로그램 을 마 운 트 해제 할 때 사용 자 는 이 파일 을 사용 할 수 있어 야 합 니 다.
예 를 들 어 촬영 한 사진 이나 다운로드 한 파일 을 사용 합 니 다.개인 파일 은 사용자 가 프로그램 을 마 운 트 해제 할 때 삭제 해 야 할 파일 입 니 다.비록 이 파일 들 은 기술적 으로 사용자 와 다른 응용 프로그램 에 접근 할 수 있 지만, 실제 적 으로 응용 프로그램 이외 의 사용자 에 게 출력 값 을 제공 하지 않 습 니 다.사용자 가 프로그램 을 마 운 트 해제 할 때 시스템 은 외부 개인 디 렉 터 리 에 있 는 모든 파일 을 삭제 합 니 다.
예 를 들 어, 다운로드 한 다른 자원 이나 임시 미디어 파일 을 사용 합 니 다.
외부 저장 장치 에 공공 파일 을 저장 하려 면 getExternalStoragePublicDirectory () 방법 으로 외부 저장 장치 에 해당 하 는 디 렉 터 리 를 표시 하 는 File 을 가 져 오 십시오.이 방법 은 다른 공공 파일 과 논리 적 으로 구 성 될 수 있 도록 저장 할 파일 형식의 인 자 를 지정 합 니 다.
예 를 들 면 DIRECTORYMUSIC 또는 DIRECTORYPICTURES。
예 를 들 면:
public File getAlbumStorageDir(String albumName) {

 // Get the directory for the user’s public pictures directory. 
File file = new File(Environment.getExternalStoragePublicDirectory( 

Environment.DIRECTORY_PICTURES), albumName); 
if (!file.mkdirs()) { 

Log.e(LOG_TAG, “Directory not created”); 
} 
return file; } 

응용 프로그램 전용 파일 을 저장 하려 면 getExternalFilesDir () 를 호출 하여 원 하 는 디 렉 터 리 형식의 이름 을 전달 하여 해당 디 렉 터 리 를 가 져 올 수 있 습 니 다.이 방법 을 통 해 만 든 각 디 렉 터 리 는 응용 프로그램의 모든 외부 저장 파일 의 부모 디 렉 터 리 에 추 가 됩 니 다. 사용자 가 응용 프로그램 을 마 운 트 해제 할 때 시스템 은 이 파일 들 을 삭제 합 니 다.
예 를 들 어 다음 과 같은 방법 으로 개인 앨범 의 디 렉 터 리 를 만 들 수 있 습 니 다.
public File getAlbumStorageDir(Context context, String albumName) { 

// Get the directory for the app’s private pictures directory. File file = new 
File(context.getExternalFilesDir( Environment.DIRECTORY_PICTURES), albumName);
 if (!file.mkdirs()) {
 Log.e(LOG_TAG, “Directory not created”);
} 
  return file;
 }

파일 에 맞 는 예약 의자 디 렉 터 리 이름 이 없 으 면 getExternal FilesDir () 를 호출 하고 null 을 전달 할 수 있 습 니 다.이것 은 외부 에 저 장 된 전용 디 렉 터 리 의 루트 디 렉 터 리 를 되 돌려 줍 니 다.getExternalFilesDir () 는 사용자 가 응용 프로그램 을 마 운 트 해제 할 때 삭 제 된 디 렉 터 리 에 디 렉 터 리 를 만 드 는 것 을 기억 하 십시오.저장 하고 있 는 파일 은 사용자 가 마 운 트 해제 한 후에 도 사용 할 수 있어 야 합 니 다. 예 를 들 어 카메라 와 사용자 가 사진 을 보관 하려 면 getExternal Storage PublicDirectory () 를 사용 해 야 합 니 다.
사용 가능 한 공간 검색
저장 할 데이터 의 양 을 미리 알 았 다 면 getFreeSpace () 나 getTotalSpace () 를 호출 하지 않 아 도 IOException 을 일 으 킬 수 있 는 충분 한 공간 이 있 는 지 알 수 있 습 니 다.이 방법 들 은 현재 사용 가능 한 공간 과 저장 볼 륨 의 총 공간 을 각각 제공한다.이 정 보 는 메모리 볼 륨 을 채 워 서 특정한 한도 값 을 초과 하 는 것 을 피 할 수 있다.
그러나 시스템 은 getFreeSpace () 가 지시 하 는 것 만큼 많은 바이트 를 쓸 수 있다 고 보장 하지 않 습 니 다.저장 할 데이터 크기 보다 반환 되 는 숫자 가 몇 MB 크 거나 파일 시스템 이 차지 하 는 공간 이 90% 미 만 이면 안전하게 계속 작업 할 수 있 습 니 다.그렇지 않 으 면 저장 소 에 쓰 지 말 아야 할 수도 있 습 니 다.
주: 파일 을 저장 하기 전에 사용 가능 한 공간 을 검사 할 필요 가 없습니다.즉시 파일 을 쓰 고 IOException 이 나타 날 때 캡 처 할 수 있 습 니 다.필요 한 정확 한 공간 을 모른다 면 이렇게 해 야 할 수도 있 습 니 다.예 를 들 어 파일 을 저장 하기 전에 PNG 그림 을 JPEG 로 변환 하여 파일 의 인 코딩 을 변경 하면 미리 파일 의 크기 를 알 수 없습니다.
파일 삭제
더 이상 필요 하지 않 은 파일 을 처음부터 끝까지 삭제 해 야 합 니 다.파일 을 삭제 하 는 가장 직접적인 방법 은 열 린 파일 을 참고 하여 delete () 를 호출 하 는 것 입 니 다.myFile.delete(); 파일 이 내부 저장 소 에 저장 되 어 있 으 면 Context 에 deleteFile () 을 호출 하여 파일 을 찾 고 삭제 하 라 고 요청 할 수 있 습 니 다.
myContext.deleteFile(fileName);

주: 사용자 가 응용 프로그램 을 마 운 트 해제 할 때 Android 시스템 은 다음 과 같은 항목 을 삭제 합 니 다. 내부 에 저 장 된 모든 파일 은 getExternal FilesDir () 를 사용 하여 외부 저장 소 에 저 장 된 모든 파일 을 사용 합 니 다.
단, getCacheDir () 를 사용 하여 정기 적 으로 만 든 모든 캐 시 파일 을 수 동 으로 삭제 하고 더 이상 필요 하지 않 은 다른 파일 을 정기 적 으로 삭제 해 야 합 니 다.
요약:
안 드 로 이 드 저장 소 는 내부 저장 소, 외부 저장 소, 내부 저장 소 가 안 드 로 이 드 N 에 저 장 된 후에 대외 적 으로 접근 하지 않 는 것 을 안전 하 게 고려 하기 위해 방문 할 필요 가 있 으 면 FileProvider 방식 으로 읽 어야 합 니 다.외부 저장 소 는 이동 가능 한 것 과 이동 할 수 없 는 것 으로 나 뉜 다.sd 카드, usb 장치 또는 기체 메모리 32GB, 16GB 등 이 있 으 며 외부 저장 소 는 apk 를 마 운 트 해제 할 지 여부 에 따라 동시에 제거 되 고 두 주소 로 나 뉘 어 서로 다른 위치 에 저장 되 며 시스템 은 서로 다른 행동 을 합 니 다.
가 져 오 는 방법:
1, getExternalStorageState () \ # apk 마 운 트 해제 와 동시에 제거 2, getExternalStoragePublicDirectory () \ # apk 마 운 트 해제 가 제거 되 지 않 습 니 다
구체 적 인 수요 에 따라 서로 다른 저장 경 로 를 선택 하 는 것 은 '메모리' 나 '외부 저장' 에 저장 하 는 것 이다.
참조: 링크:https://www.zhihu.com/question/19703373/answer/131249943

좋은 웹페이지 즐겨찾기