2013-10-27 2 views
0

Я пытаюсь создать приложение для Android.Преобразование InputStream в MappedByteBuffer в java?

Я использую InputStream inputStream=getAssets().open("book.txt"); для чтения book.txt;

Я просто хочу получить объект MappedByteBuffer из InputStream;

Кто отвечает?

========= ===========

Я использую FileInputStream fis = (FileInputStream) inputStream; причину об ошибке! здесь журнал ошибок:

 
10-27 10:45:55.830: D/dalvikvm(9243): GC_EXTERNAL_ALLOC freed 22K, 53% free 2577K/5379K, external 1916K/2428K, paused 62ms 
10-27 10:45:55.940: D/dalvikvm(9243): GC_EXTERNAL_ALLOC freed 2K, 53% free 2577K/5379K, external 2516K/2516K, paused 69ms 
10-27 10:45:56.230: I/fileName(9243): sahala.txt 
10-27 10:45:56.240: D/szipinf(9243): Initializing inflate state 
10-27 10:45:56.240: D/AndroidRuntime(9243): Shutting down VM 
10-27 10:45:56.240: W/dalvikvm(9243): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
10-27 10:45:56.260: E/AndroidRuntime(9243): FATAL EXCEPTION: main 
10-27 10:45:56.260: E/AndroidRuntime(9243): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.silenceper.bookdemo/com.silenceper.book.shl.activity.ReadBookActivity}: java.lang.ClassCastException: android.content.res.AssetManager$AssetInputStream 
10-27 10:45:56.260: E/AndroidRuntime(9243):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 
10-27 10:45:56.260: E/AndroidRuntime(9243):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
10-27 10:45:56.260: E/AndroidRuntime(9243):  at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
10-27 10:45:56.260: E/AndroidRuntime(9243):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
10-27 10:45:56.260: E/AndroidRuntime(9243):  at android.os.Handler.dispatchMessage(Handler.java:99) 
10-27 10:45:56.260: E/AndroidRuntime(9243):  at android.os.Looper.loop(Looper.java:123) 
10-27 10:45:56.260: E/AndroidRuntime(9243):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
10-27 10:45:56.260: E/AndroidRuntime(9243):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-27 10:45:56.260: E/AndroidRuntime(9243):  at java.lang.reflect.Method.invoke(Method.java:507) 
10-27 10:45:56.260: E/AndroidRuntime(9243):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
10-27 10:45:56.260: E/AndroidRuntime(9243):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
10-27 10:45:56.260: E/AndroidRuntime(9243):  at dalvik.system.NativeStart.main(Native Method) 
10-27 10:45:56.260: E/AndroidRuntime(9243): Caused by: java.lang.ClassCastException: android.content.res.AssetManager$AssetInputStream 
10-27 10:45:56.260: E/AndroidRuntime(9243):  at com.silenceper.book.shl.utils.BookPageFactory.openBookFromInputStream(BookPageFactory.java:83) 
10-27 10:45:56.260: E/AndroidRuntime(9243):  at com.silenceper.book.shl.activity.ReadBookActivity.initBookData(ReadBookActivity.java:71) 
10-27 10:45:56.260: E/AndroidRuntime(9243):  at com.silenceper.book.shl.activity.ReadBookActivity.onCreate(ReadBookActivity.java:58) 
10-27 10:45:56.260: E/AndroidRuntime(9243):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
10-27 10:45:56.260: E/AndroidRuntime(9243):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
10-27 10:45:56.260: E/AndroidRuntime(9243):  ... 11 more 

ответ

0

Обновлено

Для этого нужно сначала скопировать актив в файл, а затем применить метод ниже в файл. Если ваш актив более 1Мб вам потребуется, чтобы разделить его - Load files bigger than 1M from assets folder


Вы не можете сделать это с помощью InputStream. Вместо этого вы должны получить FileInputStream для вашего book.txt или отдать свой inputStream, а затем получить FileChannel от него:

try { 
    FileInputStream fis = (FileInputStream) inputStream; 
    FileChannel channel = fis.getChannel(); 
    ByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size()); 

    byte[] bytes = new byte[102]; 
    buffer.get(bytes); 
    System.out.println(new String(bytes)); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
+0

Предполагая, что InputStream * может * быть приведен к FileInputStream. – EJP

+0

Да, надеюсь, это не объект базы данных @silenceper, который пытается сопоставить. –

+0

код 'fis = (FileInputStream) inputStream; 'вызвать ошибку – silenceper

0

Вы не можете сделать это, по многим причинам, большинство из которых следует, что вопрос не имеет смысла.

Смежные вопросы