Android 의 assets 디 렉 터 리 에 있 는 파일 을 읽 고 쓰 는 방법 에 대한 자세 한 설명

4978 단어 Androidassets
Android 자원 파일 은 크게 두 가지 로 나 눌 수 있 습 니 다.
첫 번 째 는 res 디 렉 터 리 에 저 장 된 컴 파일 가능 한 자원 파일 입 니 다.
이러한 자원 파일 시스템 은 R.java 에서 이 자원 파일 의 ID 를 자동 으로 생 성 하기 때문에 이 자원 파일 에 접근 하 는 것 이 비교적 간단 합 니 다.R.XXX.ID 를 통 해 가능 합 니 다.
두 번 째 는 assets 디 렉 터 리 에 저 장 된 네 이 티 브 자원 파일 입 니 다.
시스템 이 컴 파일 할 때 assets 의 자원 파일 을 컴 파일 하지 않 기 때문에 R.XXX.ID 를 통 해 접근 할 수 없습니다.그럼 저 는 이 자원 의 절대적 인 경 로 를 통 해 그들 을 방문 할 수 있 습 니까?apk 설치 후/data/app/**.apk 디 렉 터 리 에 apk 형식 으로 존재 하기 때문에 asset/res 와 apk 에 연결 되 어 있 고/data/YourApp 디 렉 터 리 에 압축 을 풀 지 않 기 때문에 assets 의 절대 경 로 를 직접 얻 을 수 없습니다.왜냐하면 이것 은 전혀 없 기 때 문 입 니 다.
다행히 안 드 로 이 드 시스템 은 우리 에 게 AssetManager 도구 류 를 제공 했다.
공식 API 를 보면 알 수 있 듯 이 AssetManager 는 응용 프로그램의 원본 자원 파일 에 접근 할 수 있 습 니 다.이 클래스 는 간단 한 바이트 흐름 으로 프로그램 과 연 결 된 원본 자원 파일 을 열 고 읽 을 수 있 도록 낮은 수준의 API 를 제공 합 니 다.   
Android 는/res 디 렉 터 리 에 자원 파일 을 저장 하 는 것 외 에/assets 디 렉 터 리 에 도 자원 파일 을 저장 합 니 다./assets 디 렉 터 리 아래 에 R.java 에서 자동 으로 ID 가 생 성 되 지 않 기 때문에 assets 디 렉 터 리 아래 의 자원 파일 을 읽 으 려 면 경 로 를 제공 해 야 합 니 다.저 희 는 AssetManager 클래스 를 통 해 이 파일 에 접근 할 수 있 습 니 다.
    저 자 는 A.apk(자원 apk,예 를 들 어 so,apk,실행 가능 한 파일 등 을 assets 디 렉 터 리 아래 에 두 어야 합 니 다.apk 는 논리 코드 를 실현 하지 못 했 습 니 다)에서 지정 한 디 렉 터 리 로 자원 을 복사 해 야 합 니 다.그래서 저 자 는 자원 복사 논 리 를 실현 하 는 B.apk(하나의 Service,Activity 로 도 가능 합 니 다)를 만 들 었 습 니 다.복사 경 로 는 일반적으로 접근 하거나 만 들 수 없 기 때문에(각 apk 설치 후/data/자기 가방 이름/아래 의 개인 공간 에 만 접근 할 수 있 습 니 다)저 자 는 이 apk 가 시스템 권한(System 권한)을 가 져 올 수 있 도록 해 야 합 니 다.AndroidManifest.xml 에서 shareduserid 를 설명 하고 다음 절 을 어떻게 조작 하 는 지 구체 적 으로 기록 해 야 합 니 다.
1.AssetManager 에서 파일 을 읽 을 때 자주 사용 하 는 API
    1.파일 읽 기 방식
    AssetManager.open(String filename)은 InputSteam 형식의 바이트 흐름 을 되 돌려 줍 니 다.이 파일 이름 은 폴 더 가 아 닌 파일 이 어야 합 니 다.AssetManager 가 자원 파일 을 여 는 open 방법 은 리 로드 방법 입 니 다.열 리 는 방식 의 int 참 수 를 추가 할 수 있 습 니 다.매개 변수 에 따라 해당 하 는 작업 을 할 수 있 습 니 다.구체 적 으로 는 공식 문 서 를 보십시오.http://web.mit.edu/clio/MacData/afs/sipb/project/android/docs/reference/android/content/res/AssetManager.html
    2.자원 파일 은 폴 더 와 하위 디 렉 터 리 를 저장 할 수 있 습 니 다.
    public final String[]list(String path)는 현재 디 렉 터 리 아래 의 모든 파일 과 하위 디 렉 터 리 의 이름 을 되 돌려 줍 니 다.전체 파일 디 렉 터 리 를 재 귀적 으로 옮 겨 다 니 며 모든 자원 파일 에 접근 할 수 있 습 니 다.String[] Array of strings, one for each asset. These file names are relative to 'path'. You can open the file by concatenating 'path' and a name in the returned string (via File) and passing that to open().
2.관련 실현 코드
자원 APK(A.apk)
2016429155211907.png (332×379)
구체 적 으로 코드 세 션 을 실현 합 니 다.시스템 권한 을 사용 하기 때문에 생 성 된 경 로 는 스스로 B.apk 를 변경 할 수 있 습 니 다.

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    try {
      ctxDealFile = this.createPackageContext("com.zlc.ipanel",
          Context.CONTEXT_IGNORE_SECURITY);
    } catch (NameNotFoundException e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace();
    }
   
    btn3.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        // TODO Auto-generated method stub
        try {
          String uiFileName = "ipanelJoin";
          deepFile(ctxDealFile, uiFileName);
        } catch (Exception e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
          textView.setText("file is wrong");
        }
      }
    });
    //
  }
  public void deepFile(Context ctxDealFile, String path) {
    try {
      String str[] = ctxDealFile.getAssets().list(path);
      if (str.length > 0) {//     
        File file = new File("/data/" + path);
        file.mkdirs();
        for (String string : str) {
          path = path + "/" + string;
          System.out.println("zhoulc:\t" + path);
          // textView.setText(textView.getText()+"\t"+path+"\t");
          deepFile(ctxDealFile, path);
          path = path.substring(0, path.lastIndexOf('/'));
        }
      } else {//     
        InputStream is = ctxDealFile.getAssets().open(path);
        FileOutputStream fos = new FileOutputStream(new File("/data/"
            + path));
        byte[] buffer = new byte[1024];
        int count = 0;
        while (true) {
          count++;
          int len = is.read(buffer);
          if (len == -1) {
            break;
          }
          fos.write(buffer, 0, len);
        }
        is.close();
        fos.close();
      }
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }


좋은 웹페이지 즐겨찾기