2010-03-02 5 views
4

"ASSETS"(또는 resources/raw) 폴더에있는 Android에서 GZIP 파일을 읽으려면 어떻게해야합니까?Android : ASSETS 폴더의 GZIP 파일을 읽으십시오.

나는 다음 코드를 시도했다, 그러나 나의 스트림의 크기는 크기가 항상 1입니다 어떤 이유로 항상 1

GZIPInputStream fIn = new GZIPInputStream(mContext.getResources().openRawResource(R.raw.myfilegz)); 
int size = fIn.available(); 

입니다 그러나 Idon't 파일을 GZIP 경우, 그것을 잘 작동합니다.

참고 : 가 사용 안드로이드 1.5

+0

파일 크기를 확인 했습니까? APK 파일은 ZIP 압축 파일이므로 어쨌든 압축 된 파일은 GZIPping에 아무런 가치가 없습니다. – CommonsWare

+0

커먼웨어에 대한 반향으로, apk가 이미 압축되어 있기 때문에 gzipping 애셋이 apk 크기에 전혀 영향을 미치지 않는 것으로 나타났습니다. 여전히, 이것이 작동하지 않는 흥미로운 질문입니다. (예전에 테스트 할 때와 같은 시나리오가 있었기 때문에). –

+1

int size = fIn.available(); <- java documentation says : EOF에 도달 한 후 0을 반환하고, 그렇지 않으면 항상 1을 반환합니다. – fazo

답변

0

당신이 대신 ResourcesAssetManager를 사용하는 경우 어떻게됩니까? 예 :

InputStream is = mContext.getAssets().open("myfilegz"); 
GZIPInputStream fIn = new GZIPINputStream(is); 

내부적으로 Resources 그냥 AssetManager를 호출; 나는 어딘가에 따라 그것을 위로 musses 방법 궁금해.

0

오픈 소스 프로젝트 apps-for-android에서 source for Translate을보고 완전히 도움이되는지보십시오. 그들은 그들의 selectRandomWord에서 원시 파일 GZIPInputStream을 사용

() 함수 [라인 (326) (아래에 붙인 소스)

public void selectRandomWord() { 
    BufferedReader fr = null; 
    try { 
     GZIPInputStream is = 
       new GZIPInputStream(getResources().openRawResource(R.raw.dictionary)); 
+0

Resources가 파일에 R.raw.myfile – Tawani

+0

hmmm이 있다는 것을 알기 때문에 ridiculus 인 FileNotFoundException이 계속 발생합니다. 이상한 문제입니다. 어둠 속에서 한 번 시도했지만 http://stackoverflow.com/questions/2322820/update-jar-used-by-android-app-in-eclipse/ – snctln

2

이있다 InflaterInputStream.available의 기록 동작 :

http://java.sun.com/javase/6/docs/api/java/util/zip/InflaterInputStream.html#available()

Returns 0 after EOF has been reached, otherwise always return 1. 

남용 가능한 일반적인 실수입니다. 어떤 경우에도 파일 길이를 알려줄 수는 없습니다. 당신이 알아 차렸 듯이 때로는 이런 일이 일어납니다.) 0을 반환 할 때까지 read (byte [], int, int)를 계속 호출하려고합니다. 길이가 바이트 []를 앞에 할당하려면 ByteArrayOutputStream을 만들고 읽고 쓸 때마다 바이트를 쓰고 싶을 것입니다. 그런 다음 루프를 종료 할 때 그 바이트 []를 가져옵니다. 이것은 모든 경우에 모든 InputStream에서 유효합니다.

3
public class ResLoader { 

    /** 
    * @param res 
    * @throws IOException 
    * @throws FileNotFoundException 
    * @throws IOException 
    */ 

    static void unpackResources() throws FileNotFoundException, IOException { 
     final int BUFFER = 8192; 

     android.content.res.Resources t = TestingE3d.mContext.getResources(); 

     InputStream fis = t.openRawResource(R.raw.resources); 
     if (fis == null) 
      return; 

     ZipInputStream zin = new ZipInputStream(new BufferedInputStream(fis, 
       BUFFER)); 
     ZipEntry entry; 
     while ((entry = zin.getNextEntry()) != null) { 
      int count; 

      FileOutputStream fos = TestingE3d.mContext.openFileOutput(entry 
        .getName(), 0); 
      BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER); 

      byte data[] = new byte[BUFFER]; 

      while ((count = zin.read(data, 0, BUFFER)) != -1) { 
       dest.write(data, 0, count); 
       // Log.v("NOTAG", "writing "+count + " to "+entry.getName()); 
      } 
      dest.flush(); 
      dest.close(); 
     } 
     zin.close(); 

    } 

} 

R.raw.resources는 zip 파일입니다.이 클래스는 해당 zip의 모든 파일을 로컬 폴더로 압축을 해제합니다. NDK에 이것을 사용합니다.

당신을 통해 NDK에서 뒤마에 액세스 할 수 있습니다 /데이터/데이터 // 파일/

패키지 ResLoader이 파일 이름 = 원료에/resources.zip

3

입니다 파일 중 하나를 상주 = 패키지 자산 폴더에서 gz 파일을 읽을 때도 같은 문제가 발생했습니다.

gz 파일의 파일 이름이 원인입니다. yourfile.gz의 이름을 yourfile.bin과 같은 다른 이름으로 변경하십시오. 안드로이드 빌드 시스템은 그것이 gz라고 생각한다면 자동으로 파일을 압축 해제하는 것 같습니다.

+1

에 설명 된대로 Eclipse를 새로 고치고 다시 컴파일 해보십시오. 실제로, 파일을 압축 해제하지 않습니다. 단지'.gz' 확장자를 제거합니다. GZIPInputStream에 입력 스트림을 래핑하여 읽을 수도 있습니다. –

+0

정말 고마워요 !!! – technophyle

0

빌드 시스템은 원시 리소스로 포함되어 있어도 .gz 파일을 특별한 경우로 취급하는 것으로 보입니다. .gz 파일의 이름을 다른 확장자 (예 : .raw 또는 .bin)로 변경합니다.

Android Studio 2.2 이상에는 유효합니다.이것이 예상 된 동작인지, 더 나은지,이를 방지하는 방법을 확인하는 문서를 찾을 수는 없지만 문제를 해결하려면 확장 프로그램을 변경해야합니다.

관련 문제