title: java download speed very slow with this code
body: <pre><code>//    Uploaded.net API - Java
  //    Copyright (C) 2012  Julius Fischer webmaster@it-gecko.de
  //
  //    This program is free software: you can redistribute it and/or modify
  //    it under the terms of the GNU General Public License as published by
  //    the Free Software Foundation, either version 3 of the License, or
  //    (at your option) any later version.
  //
  //    This program is distributed in the hope that it will be useful,
  //    but WITHOUT ANY WARRANTY; without even the implied warranty of
  //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  //    GNU General Public License for more details.
  //
  //    You should have received a copy of the GNU General Public License
  //    along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.
  
  package to.uploaded.file;
  
  import java.io.BufferedOutputStream;
  import java.io.File;
  import java.io.FileOutputStream;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.OutputStream;
  import java.util.regex.Matcher;
  import java.util.regex.Pattern;
  
  import org.apache.http.Header;
  import org.apache.http.HttpEntity;
  import org.apache.http.HttpResponse;
  import org.apache.http.client.ClientProtocolException;
  import org.apache.http.client.methods.HttpGet;
  import org.apache.http.client.params.HttpClientParams;
  import org.apache.http.impl.client.DefaultHttpClient;
  import org.apache.http.util.EntityUtils;
  
  import to.uploaded.Uploaded;
  import to.uploaded.exception.DownloadFailedException;
  
  public class UPDownload extends UPDownloadEventListener{
  
      private Uploaded uploaded;
      private String path = "";
      private String fileId = "";
      private File endFile = null;
      private long progressByte = 0;
      private long contentLength = -1;
  
      public UPDownload(Uploaded uploaded, String path, String fileId)
      {
          this.uploaded = uploaded;
          this.fileId = fileId;
  
          if(!path.matches("/$"))
              path = path + "/";
  
          this.path = path;
      }
  
      /**
       * Gibt File Objekt der heruntergeladenen Datei zurück
       * @return
       */
      public File getFile()
      {
          return endFile;
      }
  
      private String getDownloadLink(String fileId) throws DownloadFailedException
      {
          try {
  
              DefaultHttpClient httpclient    = uploaded.getUpHttp().getUpClient();
              HttpClientParams.setRedirecting(httpclient.getParams(), false);
  
              HttpResponse response = httpclient.execute(new HttpGet("http://uploaded.net/file/" + fileId +"/ddl"));
  
              Header location = response.getLastHeader("Location");
              String content  = null;
  
              if(location != null)
              {
                  content = location.getValue();
  
                  if(content != null)
                  {
                      Matcher mat = Pattern.compile("http://[0-9a-z\\-]*stor\\d+.uploaded.net/dl/([0-9a-z-]+)").matcher(content);
  
                      if(mat.find())
                      {
                          httpclient.getConnectionManager().shutdown();
  
                          return mat.group(0);
                      }
                  }
              }
  
              content =  EntityUtils.toString(response.getEntity());
  
              if(content.matches("&lt;title&gt;(.*?)Wartungsarbeiten&lt;/title&gt;")) {
                  throw new DownloadFailedException("Wartungsarbeiten");
              }
  
              if(content != null)
              {
                  Matcher mat = Pattern.compile("http://[0-9a-z\\-]*stor\\d+.uploaded.net/dl/([0-9a-z-]+)").matcher(content);
  
                  if(mat.find())
                  {
                      httpclient.getConnectionManager().shutdown();
  
                      return mat.group(0);
                  }
              }
  
              httpclient.getConnectionManager().shutdown();
  
          } catch (ClientProtocolException e) {
              e.printStackTrace();
          } catch (IOException e) {
              e.printStackTrace();
          }
  
          return null;
      }
  
      /**
       * Startet den Downloadvorgang
       * @throws DownloadFailedException 
       */
      public void start() throws DownloadFailedException
      {       
          if(!isFileAvailable())
              throw new DownloadFailedException("Datei nicht mehr auf Uploaded.net vorhanden");
  
          endFile = null;
  
          DefaultHttpClient httpclient    = uploaded.getUpHttp().getUpClient();
  
          try {
  
              HttpResponse response;
              String url = getDownloadLink(fileId);
  
              if(url == null)
                  throw new DownloadFailedException("Downloadserver konnte nicht gefunden werden");
  
              response = httpclient.execute(new HttpGet(url));
              HttpEntity entity = response.getEntity();
  
              String filename = response.getHeaders("Content-Disposition")[0].getValue();
  
              Matcher mat = Pattern.compile("attachment; filename=\"([^\\\\/\\:\\*\\?\\\"\\&lt;\\&gt;\\|]+)\"").matcher(filename);
  
              if(!mat.find())
                  throw new DownloadFailedException("Dateiname nicht gefunden");
  
              filename = mat.group(1);
  
              File file = new File(path + filename);
  
              if(file.exists())
                  throw new DownloadFailedException("Dateiname existiert bereits");
  
              file.createNewFile();
  
              OutputStream out = new BufferedOutputStream(new FileOutputStream(file.getAbsoluteFile()));
  
              InputStream in = entity.getContent();
  
              contentLength = entity.getContentLength();
  
              byte[] b = new byte[1024];
              int numRead;
  
              while ((numRead = in.read(b)) != -1) {
                  out.write(b, 0, numRead);
                  updateProgress(numRead);
              }
  
              in.close();
              out.close();
              httpclient.getConnectionManager().shutdown();
  
              endFile = file;
  
  
          } catch (ClientProtocolException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          } catch (IOException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }
      }
  
      /**
       * Überprüft eine Datei auf Verfügbarkeit
       * 
       * @return true = OK | false = 404
       */
      public boolean isFileAvailable() 
      {
          try {
  
              DefaultHttpClient httpclient    = uploaded.getUpHttp().getUpClient();
  
              HttpResponse response = httpclient.execute(new HttpGet("http://uploaded.net/file/" + this.fileId +"/ddl"));
  
              httpclient.getConnectionManager().shutdown();
  
              if(response.getStatusLine().getStatusCode() == 404)
                  return false;
  
              return true;
  
          } catch (ClientProtocolException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          } catch (IOException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }
  
          return false;
      }
  
      public boolean isFinish()
      {
          return contentLength == progressByte;
      }
  
      /**
       * @return the progressByte
       */
      public long getProgressByte() {
          return progressByte;
      }
  
      /**
       * @return the contentLength
       */
      public long getContentLength() {
          return contentLength;
      }
  
      private void updateProgress(long i)
      {
          progressByte += i;
          notifyListeners(this);
      }
  
      public static interface UPDownloadProgress
      {
          void progress(UPDownload upDownload);
      }
  }
  </code></pre>
  
  <p>ok so i have an uploaded.net download api ... the problem is that code is kinda slow , when i download the file via chorme i get up to  70mb/s speed with this api ~ 4-5mb/s with is very slow ...</p>
  
  <p>I dont know why the difference is so big.. does anyone know how to fix this?</p>
  
  <p>THank you</p>