content: /*
   * Copyright 1999-2018 Alibaba Group Holding Ltd.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package com.alibaba.nacos.client.config.utils;
  
  import com.alibaba.nacos.api.common.Constants;
  
  import java.io.*;
  import java.util.ArrayList;
  import java.util.List;
  
  /**
   * IO Util
   *
   * @author Nacos
   */
  @SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
  public class IOUtils {
  
      static public String toString(InputStream input, String encoding) throws IOException {
          return (null == encoding) ? toString(new InputStreamReader(input, Constants.ENCODE))
              : toString(new InputStreamReader(input, encoding));
      }
  
      static public String toString(Reader reader) throws IOException {
          CharArrayWriter sw = new CharArrayWriter();
          copy(reader, sw);
          return sw.toString();
      }
  
      static public long copy(Reader input, Writer output) throws IOException {
          char[] buffer = new char[1 << 12];
          long count = 0;
          for (int n = 0; (n = input.read(buffer)) >= 0; ) {
              output.write(buffer, 0, n);
              count += n;
          }
          return count;
      }
  
      /**
       * 从输入流读行列表。保证不返回NULL。
       */
      static public List<String> readLines(Reader input) throws IOException {
          BufferedReader reader = toBufferedReader(input);
          List<String> list = new ArrayList<String>();
          String line = null;
          for (; ; ) {
              line = reader.readLine();
              if (null != line) {
                  list.add(line);
              } else {
                  break;
              }
          }
          return list;
      }
  
      static private BufferedReader toBufferedReader(Reader reader) {
          return reader instanceof BufferedReader ? (BufferedReader)reader : new BufferedReader(
              reader);
      }
  
      public static void delete(File fileOrDir) throws IOException {
          if (fileOrDir == null) {
              return;
          }
  
          if (fileOrDir.isDirectory()) {
              cleanDirectory(fileOrDir);
          } else {
              if (fileOrDir.exists()) {
                  boolean isDeleteOk = fileOrDir.delete();
                  if (!isDeleteOk) {
                      throw new IOException("delete fail");
                  }
              }
          }
      }
  
      /**
       * 清理目录下的内容
       */
      public static void cleanDirectory(File directory) throws IOException {
          if (!directory.exists()) {
              String message = directory + " does not exist";
              throw new IllegalArgumentException(message);
          }
  
          if (!directory.isDirectory()) {
              String message = directory + " is not a directory";
              throw new IllegalArgumentException(message);
          }
  
          File[] files = directory.listFiles();
          /**
           * null if security restricted
           */
          if (files == null) {
              throw new IOException("Failed to list contents of " + directory);
          }
  
          IOException exception = null;
          for (File file : files) {
              try {
                  delete(file);
              } catch (IOException ioe) {
                  exception = ioe;
              }
          }
  
          if (null != exception) {
              throw exception;
          }
      }
  
      public static void writeStringToFile(File file, String data, String encoding)
          throws IOException {
          OutputStream os = null;
          try {
              os = new FileOutputStream(file);
              os.write(data.getBytes(encoding));
          } finally {
              if (null != os) {
                  os.close();
              }
          }
      }
  }
  
  