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();
}
}
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
"rastgele erişim dosyası" ... ve aranmanın mümkün olmadığını mı söylüyorsunuz? – fabspro
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