content: package net.csdn.common.io;
  
  import tech.mlsql.common.utils.base.Preconditions;
  
  import java.io.*;
  
  /**
   * BlogInfo: william
   * Date: 11-9-1
   * Time: 下午4:07
   */
  public abstract class Streams {
  
      public static final int BUFFER_SIZE = 1024 * 8;
  
  
      //---------------------------------------------------------------------
      // Copy methods for java.io.File
      //---------------------------------------------------------------------
  
      /**
       * Copy the contents of the given input File to the given output File.
       *
       * @param in  the file to copy from
       * @param out the file to copy to
       * @return the number of bytes copied
       * @throws IOException in case of I/O errors
       */
      public static long copy(File in, File out) throws IOException {
          Preconditions.checkNotNull(in, "No input File specified");
          Preconditions.checkNotNull(out, "No output File specified");
          return copy(new BufferedInputStream(new FileInputStream(in)),
                  new BufferedOutputStream(new FileOutputStream(out)));
      }
  
      /**
       * Copy the contents of the given byte array to the given output File.
       *
       * @param in  the byte array to copy from
       * @param out the file to copy to
       * @throws IOException in case of I/O errors
       */
      public static void copy(byte[] in, File out) throws IOException {
          Preconditions.checkNotNull(in, "No input byte array specified");
          Preconditions.checkNotNull(out, "No output File specified");
          ByteArrayInputStream inStream = new ByteArrayInputStream(in);
          OutputStream outStream = new BufferedOutputStream(new FileOutputStream(out));
          copy(inStream, outStream);
      }
  
  
      //---------------------------------------------------------------------
      // Copy methods for java.io.InputStream / java.io.OutputStream
      //---------------------------------------------------------------------
  
  
      public static long copy(InputStream in, OutputStream out) throws IOException {
          return copy(in, out, new byte[BUFFER_SIZE]);
      }
  
      /**
       * Copy the contents of the given InputStream to the given OutputStream.
       * Closes both streams when done.
       *
       * @param in  the stream to copy from
       * @param out the stream to copy to
       * @return the number of bytes copied
       * @throws IOException in case of I/O errors
       */
      public static long copy(InputStream in, OutputStream out, byte[] buffer) throws IOException {
          Preconditions.checkNotNull(in, "No InputStream specified");
          Preconditions.checkNotNull(out, "No OutputStream specified");
          try {
              long byteCount = 0;
              int bytesRead;
              while ((bytesRead = in.read(buffer)) != -1) {
                  out.write(buffer, 0, bytesRead);
                  byteCount += bytesRead;
              }
              out.flush();
              return byteCount;
          } finally {
              try {
                  in.close();
              } catch (IOException ex) {
                  // do nothing
              }
              try {
                  out.close();
              } catch (IOException ex) {
                  // do nothing
              }
          }
      }
  
      public static byte[] copyToByteArray(InputStream in) throws IOException {
          Preconditions.checkNotNull(in, "No InputStream specified");
          ByteArrayOutputStream out = new ByteArrayOutputStream();
          byte[] buffer = new byte[6 * 1024];
          try {
              long byteCount = 0;
              int bytesRead;
              while ((bytesRead = in.read(buffer)) != -1) {
                  out.write(buffer, 0, bytesRead);
                  byteCount += bytesRead;
              }
              out.flush();
              return out.toByteArray();
          } finally {
              try {
                  in.close();
              } catch (IOException ex) {
                  // do nothing
              }
              try {
                  out.close();
              } catch (IOException ex) {
                  // do nothing
              }
          }
      }
  
      /**
       * Copy the contents of the given byte array to the given OutputStream.
       * Closes the stream when done.
       *
       * @param in  the byte array to copy from
       * @param out the OutputStream to copy to
       * @throws IOException in case of I/O errors
       */
      public static void copy(byte[] in, OutputStream out) throws IOException {
          Preconditions.checkNotNull(in, "No input byte array specified");
          Preconditions.checkNotNull(out, "No OutputStream specified");
          try {
              out.write(in);
          } finally {
              try {
                  out.close();
              } catch (IOException ex) {
                  // do nothing
              }
          }
      }
  
  
      //---------------------------------------------------------------------
      // Copy methods for java.io.Reader / java.io.Writer
      //---------------------------------------------------------------------
  
      /**
       * Copy the contents of the given Reader to the given Writer.
       * Closes both when done.
       *
       * @param in  the Reader to copy from
       * @param out the Writer to copy to
       * @return the number of characters copied
       * @throws IOException in case of I/O errors
       */
      public static int copy(Reader in, Writer out) throws IOException {
          Preconditions.checkNotNull(in, "No Reader specified");
          Preconditions.checkNotNull(out, "No Writer specified");
          try {
              int byteCount = 0;
              char[] buffer = new char[BUFFER_SIZE];
              int bytesRead;
              while ((bytesRead = in.read(buffer)) != -1) {
                  out.write(buffer, 0, bytesRead);
                  byteCount += bytesRead;
              }
              out.flush();
              return byteCount;
          } finally {
              try {
                  in.close();
              } catch (IOException ex) {
                  // do nothing
              }
              try {
                  out.close();
              } catch (IOException ex) {
                  // do nothing
              }
          }
      }
  
      /**
       * Copy the contents of the given String to the given output Writer.
       * Closes the write when done.
       *
       * @param in  the String to copy from
       * @param out the Writer to copy to
       * @throws IOException in case of I/O errors
       */
      public static void copy(String in, Writer out) throws IOException {
          Preconditions.checkNotNull(in, "No input String specified");
          Preconditions.checkNotNull(out, "No Writer specified");
          try {
              out.write(in);
          } finally {
              try {
                  out.close();
              } catch (IOException ex) {
                  // do nothing
              }
          }
      }
  
      /**
       * Copy the contents of the given Reader into a String.
       * Closes the reader when done.
       *
       * @param in the reader to copy from
       * @return the String that has been copied to
       * @throws IOException in case of I/O errors
       */
      public static String copyToString(Reader in) throws IOException {
          StringWriter out = new StringWriter();
          copy(in, out);
          return out.toString();
      }
  
      public static String copyToStringFromClasspath(ClassLoader classLoader, String path) throws IOException {
          InputStream is = classLoader.getResourceAsStream(path);
          if (is == null) {
              throw new FileNotFoundException("Resource [" + path + "] not found in classpath with class loader [" + classLoader + "]");
          }
          return copyToString(new InputStreamReader(is, "UTF-8"));
      }
  
      public static String copyToStringFromClasspath(String path) throws IOException {
          InputStream is = Streams.class.getResourceAsStream(path);
          if (is == null) {
              throw new FileNotFoundException("Resource [" + path + "] not found in classpath");
          }
          return copyToString(new InputStreamReader(is));
      }
  
  }
  