Android - Какой самый эффективный способ прочитать входной поток и сохранить в виде файла?

1

В настоящее время я использую следующее, чтобы прочитать входной поток bluetooth и сохранить его как файл. Он хорошо работает с небольшими файлами, но затем с более крупными файлами сначала создается большой массив байтов. Каков наиболее эффективный способ сделать это И убедиться, что он читает только указанную длину, не более, не менее?

    public void getAndWrite(InputStream is, long length, String filename)
            throws IOException {

        // Create the byte array to hold the data
        byte[] bytes = new byte[(int) length];

        // Read in the bytes
        int offset = 0;
        int numRead = 0;
        while (offset < bytes.length
                && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) {
            offset += numRead;
        }

        // Ensure all the bytes have been read in
        if (offset < bytes.length) {
            throw new IOException("Could not completely read stream ");
        }

        // Write the byte array to file
        FileOutputStream fos = null;
        try {
            fos = mContext.openFileOutput(filename, Context.MODE_PRIVATE);
        } catch (FileNotFoundException e) {
            Log.e(TAG, "Problem finding internal storage", e);
        }
        try {
            fos.write(bytes);
            fos.close();
        } catch (IOException e) {
            Log.e(TAG, "Problem writing file", e);
        }
    }
  • 1
    Это вызовет кучу проблем, так как вы пытаетесь прочитать все это в памяти. Откройте ваш FileOutputStream и запишите его, как вы читаете, большими кусками, чем ~ 1K. См. Stackoverflow.com/a/43163/115145
Теги:

1 ответ

1
Лучший ответ
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int remaining = length;
int read = 0;
while (remaining > 0 
       && (read = in.read(buffer, 0, Math.min(remaining, bufferSize))) >= 0) {
   out.write(buffer, 0, read);
   remaining -= read;
} 

Обратите внимание, что вышеупомянутое гарантирует, что вы больше не пишете байты длины. Но он не гарантирует, что вы пишете точно длины байтов. Я не вижу, как вы могли бы это сделать без чтения байтов длины в памяти или чтения байтов длины и записи в временный файл, а затем записи временного файла в конечный пункт назначения.

  • 0
    Спасибо, это работает удовольствие без проблем кучи, с которыми я столкнулся.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню