package util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Serializable;
import java.io.StringWriter;
import java.io.Writer;

/**
 * Created by sunhao on 17/5/9.
 * IO工具类
 */
public class IOUtil
{
    public static void close(OutputStream os) {
        if (os != null) {
            try {
                os.close();
            } catch (Exception ignored) {
            }
        }
    }

    public static void close(InputStream is) {
        if (is != null) {
            try {
                is.close();
            } catch (Exception ignored) {
            }
        }
    }

    public static void close(Writer os) {
        if (os != null) {
            try {
                os.close();
            } catch (Exception ignored) {
            }
        }
    }

    public static void close(Reader is) {
        if (is != null) {
            try {
                is.close();
            } catch (Exception ignored) {
            }
        }
    }

    public static void deleteAllFiles(File directory) {

        File[] files = directory.listFiles();
        for (File file : files) {
            if (!file.delete()) {
                // System.out.println("Cannot delete " + file);
            }
        }
    }

    public static String readString(InputStream input, String encoding)
            throws IOException {
        InputStreamReader ir = (encoding == null ? new InputStreamReader(input) : new InputStreamReader(input, encoding));
        StringWriter sw = new StringWriter();
        try {
            copy(ir, sw);
            return sw.toString();
        } finally {
            close(sw);
        }
    }

    public static long copy(InputStream in, OutputStream out)
            throws IOException {
        byte[] buffer = new byte[1024 * 4];
        int len;
        long count = 0;

        while ((len = in.read(buffer)) >= 0) {
            out.write(buffer, 0, len);
            count += len;
        }
        return count;
    }

    public static long copy(Reader in, Writer out)
            throws IOException {
        char[] buffer = new char[1024 * 4];
        int len;
        long count = 0;

        while ((len = in.read(buffer)) >= 0) {
            out.write(buffer, 0, len);
            count += len;
        }
        return count;
    }

    public static long copy(File src, File dest)
            throws IOException {
        FileInputStream fis = new FileInputStream(src);
        FileOutputStream fos = new FileOutputStream(dest);
        try {
            return copy(fis, fos);
        } finally {
            close(fis);
            close(fos);
        }
    }

    public static byte[] objToBytes(Serializable obj)
            throws IOException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oo = new ObjectOutputStream(bos);
        try {
            oo.writeObject(obj);
            return bos.toByteArray();
        } finally {
            close(oo);
            close(bos);
        }
    }

    public static Object objFromBytes(byte[] bytes)
            throws IOException, ClassNotFoundException {
        ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
        ObjectInputStream oi = new ObjectInputStream(bis);
        try {
            return oi.readObject();
        } finally {
            close(oi);
            close(bis);
        }
    }

    public static void objToStream(OutputStream os, Serializable obj)
            throws IOException {
        ObjectOutputStream oo = new ObjectOutputStream(os);
        try {
            oo.writeObject(obj);
        } finally {
            close(oo);
        }
    }

    public static Object objFromStream(InputStream is)
            throws IOException, ClassNotFoundException {
        ObjectInputStream oi = new ObjectInputStream(is);
        try {
            return oi.readObject();
        } finally {
            close(oi);
        }
    }

    public static void saveObject(File file, Serializable obj)
            throws IOException {
        objToStream(new BufferedOutputStream(new FileOutputStream(file)), obj);
    }

    public static Object loadObject(File file)
            throws IOException, ClassNotFoundException {
        return objFromStream(new BufferedInputStream(new FileInputStream(file)));
    }
}