自己用tomcat搭了个服务器,上边有一些MP3文件,然后在android的应用程序中下载这些文件
可恶的是,下载下来的文件竟然会比原文件要大,而且播放的时候有杂音,且只能够播放一小会,就抛异常了
这是怎么回事呢?

解决方案 »

  1.   

    主要的下载代码为这个函数 
    public File write2SDFromInput(String path,String fileName,InputStream input)
    {
    File file=null;
    OutputStream output=null;
    try{
    this.creatSDDir(path);
    file=this.creatSDFile(path+fileName);
    output=new FileOutputStream(file);
    byte buffer[]=new byte[4*1024];
    while((input.read(buffer))!=-1){
    output.write(buffer);
    }

    output.flush();
    }
    catch(Exception e){
    e.printStackTrace();
    }

    finally{
    try{
    output.close();
    }
    catch(Exception e){
    e.printStackTrace();
    }
    }

    return file;
    }
      

  2.   

    09-16 01:29:54.347: DEBUG/dalvikvm(282): GC_FOR_MALLOC freed 5009 objects / 325248 bytes in 87ms
    09-16 01:30:56.467: DEBUG/SntpClient(59): request time failed: java.net.SocketException: Address family not supported by protocol
      

  3.   

    你这个是mars老师视频里面的代码吧
      

  4.   

    你把这个write2SDFromInput方法修改一下 public byte[] readStream(InputStream input) throws Exception {
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = -1;
            while ((len = input.read(buffer)) != -1) {
                output.write(buffer, 0, len);
            }
            input.close();
            output.close();
            return output.toByteArray();
        }
      public void getMp3()throws Exception{        String urlPath = "http://www.im.ntu.edu.tw/~b97006/01.mp3";
         URL url = new URL(urlPath);
            
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();//返回一个连接对象
            conn.setRequestMethod("GET");//设置请求方式
            conn.setConnectTimeout(6*1000);//设置连接超时,这里可以不用设置,但是在android应用中应该设置超时时间
            if (conn.getResponseCode()==200) {
                InputStream input = conn.getInputStream();
                byte[] data = readStream(input);
                File file = new File("/home/lgh/1233.mp3");
                file.createNewFile();
                FileOutputStream output = new FileOutputStream(file);
                output.write(data);
                output.close();
            }
        }试试看,可以的!
      

  5.   

      File file = new File("/home/lgh/1233.mp3");
                file.createNewFile();
    这里的文件目录你自己修改下
      

  6.   

    果然给力  谢谢啦   可我还是不知道这是为什么?
    为何这样子读取:
     ByteArrayOutputStream output = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = -1;
            while ((len = input.read(buffer)) != -1) {
                output.write(buffer, 0, len);
            }
            input.close();
            output.close();
            return output.toByteArray();
    就可以了
    而:
    byte buffer[]=new byte[4*1024];
    while((input.read(buffer))!=-1){
    output.write(buffer);
    }却不行
      

  7.   

    这样子还是有问题   因为每一次都是把输入流的内容先全部加载到内存  然后才写到sdcard
    当你同时下载多个文件的时候  就会出现09-16 14:11:24.469: ERROR/AndroidRuntime(315): java.lang.OutOfMemoryError
    的异常  即内存不够用了
      

  8.   


    我懂了  其实  就是:output.write(buffer);和output.write(buffer,0,temp);的区别
      

  9.   

    我想问下,byte buffer[]=new byte[1024]  与byte buffer[]=new byte[4*1024];
    的差别,这两种方式定义了单位读的字节取么,前者是1K,后者是4K 么?谢谢