단말에서 웹서버를 통해  파일 다운로드 하고 있는데요

아래와 같이 처리 하고 있습니다. 

               BufferedInputStream bis = new BufferedInputStream(is);
                fos = new FileOutputStream(mPath);  
               
                BufferedOutputStream bos = new BufferedOutputStream(fos);
                 int n = 0;
                 while((n = bis.read()) != -1) {
                        bos.write(n);
                 }

6M 정도의 파일을 받는데 위와같이 처리하면 7k정도 작게 파일을 받게 되구요...
버퍼를 설정하여 

byte[] data = new byte[512];

              BufferedInputStream bis = new BufferedInputStream(is);
                fos = new FileOutputStream(mPath);  
               
                BufferedOutputStream bos = new BufferedOutputStream(fos);
                 int n = 0;
                 while((n = bis.read(data)) != -1) {
                        bos.write(n);
                 }

로 파일을 받는 처리를 하면 10k 조금 넘게만 파일에 쓰여집니다.

1바이트씩 받을 경우에만 파일이 완벽하게 받아지는데요...그럼 시간이 너무 오래 걸려서요

버퍼 사용하여 파일 받는 방법이 왜 사이즈 오류가 나는지 궁금합니다....;;

 private int downloadFile(String fileUrl){
   
         URL myFileUrl =null;         
         
         byte[] data = new byte[512];
         
         try {
              myFileUrl= new URL(fileUrl);
         } catch (MalformedURLException e) {
              e.printStackTrace();
         }
         try {
              HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection();
              conn.setDoInput(true);
              conn.connect();
              InputStream is = conn.getInputStream();
              String mPath = "sdcard/apk/EDAILY_STOCK_nh.apk";
              FileOutputStream fos;
              File f = new File(mPath);
              
              if(f.exists()) f.delete();
              if ( f.createNewFile() ) {
                BufferedInputStream bis = new BufferedInputStream(is); 
                fos = new FileOutputStream(mPath);   
                
                BufferedOutputStream bos = new BufferedOutputStream(fos); 
     int n = 0; 
     while((n = bis.read()) != -1) { 
      bos.write(n); 
     } 
     bos.close(); 
                 fos.close();
              } else {
               f.delete();
               return -1;
              }
         } catch (IOException e) {
              e.printStackTrace();
           return -1;      
         }
   return 0;      
 }