Java 如何实现internet音频流缓冲区?

Java 如何实现internet音频流缓冲区?,java,android,buffer,Java,Android,Buffer,我有一个doInBackground方法,可以从互联网上录制音频流。主要工作在内部完成,而len!=-1 { }. 这很好,但是buffer=new byte[]没有像我预期的那样工作-当连接中断时,立即调用IOException,并且不再使用缓冲区。我如何使这个缓冲区为我的代码提供信息,直到它为空?我想要有和音频播放器一样的行为;因此,首先当您连接到流时,它正在缓冲,然后播放,如果连接被中断,它仍然从缓冲区播放,直到它为空 记录器: protected Boolean doInBackgr

我有一个doInBackground方法,可以从互联网上录制音频流。主要工作在内部完成,而len!=-1 { }. 这很好,但是buffer=new byte[]没有像我预期的那样工作-当连接中断时,立即调用IOException,并且不再使用缓冲区。我如何使这个缓冲区为我的代码提供信息,直到它为空?我想要有和音频播放器一样的行为;因此,首先当您连接到流时,它正在缓冲,然后播放,如果连接被中断,它仍然从缓冲区播放,直到它为空

记录器:

  protected Boolean doInBackground(String... StringUrls) {

        boolean fdetermined = false;
        Environment env = new Environment();
        Calendar c = Calendar.getInstance();
        BufferedOutputStream bufOutstream = null;

      buffer = new byte[1024 * 10];
        int len=-1;

        InputStream in = null;

        URLConnection conn = null;


        try{

            conn = new URL(StringUrls[0]).openConnection();
            conn.setConnectTimeout(5000);
            in = conn.getInputStream();
            len = in.read(buffer);

            File dir = new File(env.getExternalStorageDirectory() + "/somewhere");
            if (!dir.exists()) {
                dir.mkdir();
            }


            filename = env.getExternalStorageDirectory()+"/somewhere/file";
            bufOutstream = new BufferedOutputStream(new FileOutputStream(new File(filename)));

        } catch (IOException e) {
            System.err.println("Caught IOException: " + e.getMessage());


        }



        while (len != -1) {

            if(in != null && buffer != null && bufOutstream != null) {
                try {

                bufOutstream.write(buffer, 0, len);

                 len = in.read(buffer);

                if (Recorder.this.isCancelled)  {

                    Recorder.this.stopSelf();
                    break;
                }

            } catch (IOException e) {
                e.printStackTrace();

                conn = null;
                in = null;


            }
        }

            }

            try{

                if(bufOutstream != null)    {
            bufOutstream.close();
                }

        } catch (IOException e) {
            e.printStackTrace();


        }


        return true;
        }
IO异常:

12-16 14:37:16.999  31950-32021/com.app.example W/System.err﹕ java.net.SocketException: recvfrom failed: ETIMEDOUT (Connection timed out)
12-16 14:37:17.059  31950-32021/com.app.example W/System.err﹕ at libcore.io.IoBridge.maybeThrowAfterRecvfrom(IoBridge.java:542)
12-16 14:37:17.109  31950-32021/com.app.example W/System.err﹕ at libcore.io.IoBridge.recvfrom(IoBridge.java:506)
12-16 14:37:17.109  31950-32021/com.app.example W/System.err﹕ at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)
12-16 14:37:17.109  31950-32021/com.app.example W/System.err﹕ at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
12-16 14:37:17.119  31950-32021/com.app.example W/System.err﹕ at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240)
12-16 14:37:17.119  31950-32021/com.app.example W/System.err﹕ at java.io.BufferedInputStream.read(BufferedInputStream.java:304)
12-16 14:37:17.149  31950-32021/com.app.example W/System.err﹕ at libcore.net.http.UnknownLengthHttpInputStream.read(UnknownLengthHttpInputStream.java:41)
12-16 14:37:17.149  31950-32021/com.app.example W/System.err﹕ at java.io.InputStream.read(InputStream.java:163)
12-16 14:37:17.189  31950-32021/com.app.example W/System.err﹕ at com.app.example.Recorder$RecordTask.doInBackground(Recorder.java:376)
12-16 14:37:17.189  31950-32021/com.app.example W/System.err﹕ at com.app.example.Recorder$RecordTask.doInBackground(Recorder.java:288)
12-16 14:37:17.189  31950-32021/com.app.example W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:264)
12-16 14:37:17.189  31950-32021/com.app.example W/System.err﹕ at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
12-16 14:37:17.199  31950-32021/com.app.example W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:137)
12-16 14:37:17.199  31950-32021/com.app.example W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
12-16 14:37:17.199  31950-32021/com.app.example W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
12-16 14:37:17.199  31950-32021/com.app.example W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
12-16 14:37:17.199  31950-32021/com.app.example W/System.err﹕ at java.lang.Thread.run(Thread.java:856)
12-16 14:37:17.199  31950-32021/com.app.example W/System.err﹕ Caused by: libcore.io.ErrnoException: recvfrom failed: ETIMEDOUT (Connection timed out)
12-16 14:37:17.199  31950-32021/com.app.example W/System.err﹕ at libcore.io.Posix.recvfromBytes(Native Method)
12-16 14:37:17.199  31950-32021/com.app.example W/System.err﹕ at libcore.io.Posix.recvfrom(Posix.java:131)
12-16 14:37:17.209  31950-32021/com.app.example W/System.err﹕ at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:164)
12-16 14:37:17.209  31950-32021/com.app.example W/System.err﹕ at libcore.io.IoBridge.recvfrom(IoBridge.java:503)

我在下面添加了最后一个块:

  while (len != -1) {

                if(in != null && buffer != null && bufOutstream != null) {
                    try {

                        bufOutstream.write(buffer, 0, len);

                        len = in.read(buffer);

                        if (Recorder.this.isCancelled)  {

                            Recorder.this.stopSelf();
                            break;
                        }

                    } catch (IOException e) {
                        e.printStackTrace();

                        conn = null;
                        in = null;


                    }
                    finally{

                        //do your work here. This block will execute no matter of what exception is thrown
                        try{

                            if(bufOutstream != null)    {
                                bufOutstream.close();
                            }

                        } catch (IOException e) {
                            e.printStackTrace();


                        }
                    }
                }

            }

好的,但是在最后一块中放什么呢?我不知道这和我的问题有什么关系。