2012-02-17 17 views
5

Android kaynak dizinindeki bir ham kaynak dosyadan RandomAccessFile nesnesini başarıyla oluşturmayı denedim.Android raw kaynak dosyasında RandomAccessFile

Ham kaynak dosyasından bir girdi akışı nesnesi elde edebiliyorum.

getResources().openRawResource(R.raw.file); 

ham varlık dosyasından bir RandomAccessFile nesnesi oluşturmak için ya da ben inputStream ile sopa gerekir mi mümkün mü?

+2

ben öyle düşünmüyorum InputStream bu kadar 're almak muhtemelen bir ZipEntryInputStream' dir. Ve sıkıştırıldığı için onu akış olarak okumalısın. Dosyadaki farklı konumlara bakmak muhtemelen RandomAccessFile'nin yapabileceği bir şey değildir. – Brigham

+0

"rastgele erişim dosyası" ... ve aranmanın mümkün olmadığını mı söylüyorsunuz? – fabspro

+0

Dosyayı SD karta kopyalamanız gerekir (bkz. Http://stackoverflow.com/questions/4447477/android-how-to-copy-files-in-assets-to-sdcard). Daha sonra RandomAccessFile'ı üzerinde kullanabilirsiniz. . – ron

cevap

1

Her şey ara belleğe alınmadan bir giriş akışında ileri ve geri aramak mümkün değildir. Bu son derece maliyetli olabilir ve bazı keyfi boyutlardaki (ikili) bir dosyayı okumak için ölçeklenebilir bir çözüm değildir.

Haklısınız: İdeal olarak, bir kullanıcı bir RandomAccessFile kullanır, ancak kaynaklardan okuma yerine bir giriş akışı sağlar. Yukarıdaki yorumlarda belirtilen öneri, dosyayı SD karta yazmak için giriş akışını kullanmak ve oradan rastgele dosyaya erişmektir. Sen, geçici dizine yazma okumayı ve kullanımdan sonra da silmenize olabilir: o kaynak dosyası hala sıkıştırılmış APK saklanacaktır çünkü,

String file = "your_binary_file.bin"; 
AssetFileDescriptor afd = null; 
FileInputStream fis = null; 
File tmpFile = null; 
RandomAccessFile raf = null; 
try { 
    afd = context.getAssets().openFd(file); 
    long len = afd.getLength(); 
    fis = afd.createInputStream(); 
    // We'll create a file in the application's cache directory 
    File dir = context.getCacheDir(); 
    dir.mkdirs(); 
    tmpFile = new File(dir, file); 
    if (tmpFile.exists()) { 
     // Delete the temporary file if it already exists 
     tmpFile.delete(); 
    } 
    FileOutputStream fos = null; 
    try { 
     // Write the asset file to the temporary location 
     fos = new FileOutputStream(tmpFile); 
     byte[] buffer = new byte[1024]; 
     int bufferLen; 
     while ((bufferLen = fis.read(buffer)) != -1) { 
      fos.write(buffer, 0, bufferLen); 
     } 
    } finally { 
     if (fos != null) { 
      try { 
       fos.close(); 
      } catch (IOException e) {} 
     } 
    } 
    // Read the newly created file 
    raf = new RandomAccessFile(tmpFile, "r"); 
    // Read your file here 
} catch (IOException e) { 
    Log.e(TAG, "Failed reading asset", e); 
} finally { 
    if (raf != null) { 
     try { 
      raf.close(); 
     } catch (IOException e) {} 
    } 
    if (fis != null) { 
     try { 
      fis.close(); 
     } catch (IOException e) {} 
    } 
    if (afd != null) { 
     try { 
      afd.close(); 
     } catch (IOException e) {} 
    } 
    // Clean up 
    if (tmpFile != null) { 
     tmpFile.delete(); 
    } 
} 
+3

Bu gerçekten tek yol mu? Aşırı döner kavşak görünüyor. Ham dizindeki bir kaynak dosyasına rastgele erişmenin bir yolu yok mu? – Fra

İlgili konular