NanoHTTPD. Кэш InputStream для записи и продолжения потоковой передачи

Я хочу кэшировать данные во время воспроизведения в MediaPlayer. Когда я прочитал, есть один способ сделать это – создать собственный локальный HTTP-сервер и установить локальный url в setDataSource MediaPlayer (String path).

Я использую NanoHTTPD в качестве локального сервера. Существует код функции подачи:


     @Override
     Public Response serve (String uri, метод метода, заголовки карт, карты карт, файлы карт)
     {
         пытаться
         {
             // delete / character
             URL url = новый URL (uri.substring (1));
             Соединение URLConnection = url.openConnection ();
             connection.connect ();

             Файл cacheFolder = новый файл (Environment.getExternalStorageDirectory (), «TracksFlowCacheNew»);
             Log.e («RelayServer», «Cache to file» + Utils.md5 (url.toExternalForm ()));
             RelayInputStream ris = new RelayInputStream (connection.getInputStream (), новый FileOutputStream (новый файл (cacheFolder, Utils.md5 (url.toExternalForm ())));


             Return new Response (Response.Status.OK, NanoHTTPD.MIME_DEFAULT_BINARY, ris);
         }
         Catch (MalformedURLException e)
         {
             // TODO Автогенерируемый блок catch
             e.printStackTrace ();
         }
         Catch (FileNotFoundException e)
         {
             // TODO Автогенерируемый блок catch
             e.printStackTrace ();
         }
         Catch (IOException e)
         {
             // TODO Автогенерируемый блок catch
             e.printStackTrace ();
         }

         Return null;
     }

RelayInputStream расширяет InputStream. Я пытаюсь кэшировать данные там:


     Частный класс RelayInputStream расширяет InputStream
     {
         Private InputStream mInputStream = null;
         Private OutputStream mOutputStream = null;

         Public RelayInputStream (InputStream is, OutputStream os)
         {
             MInputStream = is;
             MOutputStream = os;
         }

         @Override
         Public int available () выбрасывает IOException
         {
             Log.e («доступно», «доступно =» + mInputStream.available ());
             mInputStream.mark (mInputStream.available ());
             Return mInputStream.available ();
         }

         @Override
         Public int read (byte [] buffer) выбрасывает IOException
         {
             Log.e ("read", "buffer =" + buffer.toString ());
             mOutputStream.write (буфер);
             Return mInputStream.read (buffer);
         }

         @Override
         Public int read (byte [] buffer, int offset, int length) throws IOException
         {
             Log.e ("read", "buffer =" + buffer.toString () + "; offset =" + offset + "; length =" + length);
             MOutputStream.write (буфер, смещение, длина);
             Return mInputStream.read (буфер, смещение, длина);
         }

         @Override
         Public int read () выбрасывает IOException
         {
             Log.e («читать», «нет данных»);
             Байт [] b = новый байт [1];
             mInputStream.read (б);
             mOutputStream.write (б);
             mInputStream.close ();
             mOutputStream.close ();
             Return b [0] & 0xff;
         }
     }

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