title: Limiting InputStream
body: <p>I'm quite new to Java. I wrote an Swing application which downloads specific files over internet.</p>
  
  <p>What I'd like to do is to limit <code>InputStream</code> to read <code>n</code> (lets say 10240 bytes, this might change though) bytes per second.</p>
  
  <p>Once the whole file is read, it should save the file into a local directory such as <code>C:\Downloads\</code></p>
  
  <p>I'm guessing I should create a class which extends to <code>InputStream</code> and override its methods but I'm not exactly sure how and which methods to achieve my goal.</p>
  
  <p>I use <a href="http://www.codejava.net/java-se/networking/use-httpurlconnection-to-download-file-from-an-http-url" rel="nofollow">this</a> example for HTTP downloads and <a href="http://www.codejava.net/java-se/networking/ftp/java-ftp-file-download-tutorial-and-example" rel="nofollow">this</a> example for FTP.</p>
  
  <p><strong>HTTP Example;</strong></p>
  
  <pre><code>package net.codejava.networking;
  
  import java.io.File;
  import java.io.FileOutputStream;
  import java.io.IOException;
  import java.io.InputStream;
  import java.net.HttpURLConnection;
  import java.net.URL;
  
  /**
   * A utility that downloads a file from a URL.
   * @author www.codejava.net
   *
   */
  public class HttpDownloadUtility {
      private static final int BUFFER_SIZE = 4096;
  
      /**
       * Downloads a file from a URL
       * @param fileURL HTTP URL of the file to be downloaded
       * @param saveDir path of the directory to save the file
       * @throws IOException
       */
      public static void downloadFile(String fileURL, String saveDir)
              throws IOException {
          URL url = new URL(fileURL);
          HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
          int responseCode = httpConn.getResponseCode();
  
          // always check HTTP response code first
          if (responseCode == HttpURLConnection.HTTP_OK) {
              String fileName = "";
              String disposition = httpConn.getHeaderField("Content-Disposition");
              String contentType = httpConn.getContentType();
              int contentLength = httpConn.getContentLength();
  
              if (disposition != null) {
                  // extracts file name from header field
                  int index = disposition.indexOf("filename=");
                  if (index &gt; 0) {
                      fileName = disposition.substring(index + 10,
                              disposition.length() - 1);
                  }
              } else {
                  // extracts file name from URL
                  fileName = fileURL.substring(fileURL.lastIndexOf("/") + 1,
                          fileURL.length());
              }
  
              System.out.println("Content-Type = " + contentType);
              System.out.println("Content-Disposition = " + disposition);
              System.out.println("Content-Length = " + contentLength);
              System.out.println("fileName = " + fileName);
  
              // opens input stream from the HTTP connection
              InputStream inputStream = httpConn.getInputStream();
              String saveFilePath = saveDir + File.separator + fileName;
  
              // opens an output stream to save into file
              FileOutputStream outputStream = new FileOutputStream(saveFilePath);
  
              int bytesRead = -1;
              byte[] buffer = new byte[BUFFER_SIZE];
              while ((bytesRead = inputStream.read(buffer)) != -1) {
                  outputStream.write(buffer, 0, bytesRead);
              }
  
              outputStream.close();
              inputStream.close();
  
              System.out.println("File downloaded");
          } else {
              System.out.println("No file to download. Server replied HTTP code: " + responseCode);
          }
          httpConn.disconnect();
      }
  }
  </code></pre>
  
  <p><strong>FTP Example;</strong></p>
  
  <pre><code>import java.io.BufferedOutputStream;
  import java.io.File;
  import java.io.FileInputStream;
  import java.io.FileOutputStream;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.OutputStream;
  
  import org.apache.commons.net.ftp.FTP;
  import org.apache.commons.net.ftp.FTPClient;
  
  /**
   * A program demonstrates how to upload files from local computer to a remote
   * FTP server using Apache Commons Net API.
   * @author www.codejava.net
   */
  public class FTPDownloadFileDemo {
  
      public static void main(String[] args) {
          String server = "www.myserver.com";
          int port = 21;
          String user = "user";
          String pass = "pass";
  
          FTPClient ftpClient = new FTPClient();
          try {
  
              ftpClient.connect(server, port);
              ftpClient.login(user, pass);
              ftpClient.enterLocalPassiveMode();
              ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
  
              // APPROACH #1: using retrieveFile(String, OutputStream)
              String remoteFile1 = "/test/video.mp4";
              File downloadFile1 = new File("D:/Downloads/video.mp4");
              OutputStream outputStream1 = new BufferedOutputStream(new FileOutputStream(downloadFile1));
              boolean success = ftpClient.retrieveFile(remoteFile1, outputStream1);
              outputStream1.close();
  
              if (success) {
                  System.out.println("File #1 has been downloaded successfully.");
              }
  
              // APPROACH #2: using InputStream retrieveFileStream(String)
              String remoteFile2 = "/test/song.mp3";
              File downloadFile2 = new File("D:/Downloads/song.mp3");
              OutputStream outputStream2 = new BufferedOutputStream(new FileOutputStream(downloadFile2));
              InputStream inputStream = ftpClient.retrieveFileStream(remoteFile2);
              byte[] bytesArray = new byte[4096];
              int bytesRead = -1;
              while ((bytesRead = inputStream.read(bytesArray)) != -1) {
                  outputStream2.write(bytesArray, 0, bytesRead);
              }
  
              success = ftpClient.completePendingCommand();
              if (success) {
                  System.out.println("File #2 has been downloaded successfully.");
              }
              outputStream2.close();
              inputStream.close();
  
          } catch (IOException ex) {
              System.out.println("Error: " + ex.getMessage());
              ex.printStackTrace();
          } finally {
              try {
                  if (ftpClient.isConnected()) {
                      ftpClient.logout();
                      ftpClient.disconnect();
                  }
              } catch (IOException ex) {
                  ex.printStackTrace();
              }
          }
      }
  }
  </code></pre>
  
  <p>What I'd like is to limit the download rate of these 2 input streams so downloading speed would be limited while getting these files from remote location.</p>
  
  <p>I'd really appreciate if you could show me an example with a short explanation.</p>