一、OutputStream write
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class StreamTest2 {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    //File file=new File("/Users/hanzhao/Desktop/zhaohanhan.txt");
    //System.out.println(file.exists());

    //题外话
    String s="aa我";
    System.out.println(s.length());//返回3个字符char
    byte[]bytes1=s.getBytes();
    System.out.println(bytes1.length);//返回5个字节,一个字母一个字节,一个汉字两个字节

    //FileOutputStream fos = null;//局部变量要赋值
    OutputStream fos = null;//用FileOutputStream 的父类来调用,OutputStream是abstract抽象类,不能new
    try {
//  fos = new FileOutputStream("/Users/hanzhao/Desktop/zhaohanhan.txt");
    fos=new FileOutputStream("/Users/hanzhao/Desktop/daleilei.txt");
    byte[] bytes="aaa找找找adfsdfsdfads的房间都是法律框架上的六块腹肌都是".getBytes();//String类里面的方法,返回byte【】
    fos.write(bytes);
    //fos.close();//如果前面的代码出现问题,那么fos.close();就不会被执行,所以,把这个方法写在finally,保障一定被执行
    //不执行的话,会占用资源,执行一次占用一次
    }catch(FileNotFoundException e) {
        System.out.println("找不到文件");
    }catch(IOException ex) {
        System.out.println("找不到文件流");
    }finally {
        if(fos!=null) {
            try {
            fos.close();
            }catch(IOException e) {
                //里面可以不写,耍流氓啊啊啊啊啊啊
            }
        }
    }  //结果就是daleilei.txt被写入内容

}

}

二、InputStream read
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class StreamTest1 {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    InputStream fis = null;
    try {
        fis = new FileInputStream("/Users/hanzhao/Desktop/xiaoshuo.txt");
        //xiaoshuo.txt里面已经放好了内容,把这些内容read到console控制台里面
        byte[] bytes = new byte[50];
        /*int b=fis.read(bytes);//返回值int,代表每次读的字节数
        System.out.println(b);//每次读50个字节
        System.out.println(bytes);//[B@79698539
        System.out.println(new String(bytes));
        //要把read的bytes字节转换为String数据,但是这样只能read到50个字节的内容,所有我们要用while循环以下
        */
        while(fis.read(bytes)>0) {//如果写成fis.read()>0,显示为一片空白
            String s=new String(bytes);
            System.out.print(s);
            System.out.println(s);
        }//read成功,但是有乱码,这是因为读取字节流,按每次50个字节读,有可能会read到半个汉字的原因。

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        System.out.println("文件地址不对");
        // e.printStackTrace();
    } catch (IOException e) {
        System.out.println("read❌");
    } finally {
        if (fis != null) {
            try {
                fis.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                // e.printStackTrace();
            }
        }
    }

}

}
三、字节流,read and write
// 没有调用IOUtils中的copy方法,老老实实自己写
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class StreamTest3 {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    long startMS = System.currentTimeMillis();
    InputStream fis = null;
    OutputStream fos = null;
    try {
        fis = new FileInputStream("/Users/hanzhao/Desktop/zhaizhai.txt");
        fos = new FileOutputStream("/Users/hanzhao/Desktop/xiaofengfeng.txt");
        byte[] bytes = new byte[1204];
        int len;
        while ((len = fis.read(bytes)) > 0) {
            fos.write(bytes, 0, len);
        }

        long endMS = System.currentTimeMillis();
        System.out.println("copytime is" + (endMS - startMS));

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        // e.printStackTrace();
        System.out.println("file is not exist" + e.getMessage());

    } catch (IOException e) {
        // TODO Auto-generated catch block
        // e.printStackTrace();
        System.out.println();
    } finally {
        IOUtils.closeQuietly(fis);
        IOUtils.closeQuietly(fos);
    }

}

}

四、调用了IOUtils中的方法了
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class StreamTest5 {

public static void main(String[] args) {

    //调用了IOUtils中的方法了
    long startMS = System.currentTimeMillis();
    InputStream fis = null;
    OutputStream fos = null;
    try {
        fis = new FileInputStream("/Users/hanzhao/Desktop/zhaizhai.txt");
        fos = new FileOutputStream("/Users/hanzhao/Desktop/xiaofengfeng.txt");
        /*byte[] bytes = new byte[1204];
        int len;
        while ((len = fis.read(bytes)) > 0) {
            fos.write(bytes, 0, len);
        }*/
        IOUtils.copy(fis, fos);

        long endMS = System.currentTimeMillis();
        System.out.println("copytime is" + (endMS - startMS));

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        // e.printStackTrace();
        System.out.println("file is not exist" + e.getMessage());

    } catch (IOException e) {
        // TODO Auto-generated catch block
        // e.printStackTrace();
        System.out.println();
    } finally {
        IOUtils.closeQuietly(fis);
        IOUtils.closeQuietly(fos);
    }

}

//自己写的copy方法,好搞笑写的,太×××烂啦,怎么想的,int bufferSize明明指的是1024等等数值,我怎么把它想成返回值了
//还有,公式不是万能的啊,明明只能代替下面这些,我怎么全写上了,服了,服了。。。。。。
// byte[] bytes = new byte[1204];
// int buffSize1;
// while ((buffSize1 = inStream1.read(bytes)) > 0) {
// outStream1.write(bytes, 0, buffSize1);
// }
//copy方法放在IUOtils类里面了,方便一些存放和调用
public static void copy(InputStream inStream, OutputStream outStream, int bufferSize) {

    InputStream inStream1 = null;
    OutputStream outStream1 = null;
    try {
        inStream1 = new FileInputStream("/Users/hanzhao/Desktop/zhaizhai.txt");
        outStream1 = new FileOutputStream("/Users/hanzhao/Desktop/xiaofengfeng.txt");
        byte[] bytes = new byte[1204];
        int buffSize1;
        while ((buffSize1 = inStream1.read(bytes)) > 0) {
            outStream1.write(bytes, 0, buffSize1);
        }

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        // e.printStackTrace();
        System.out.println("file is not exist" + e.getMessage());

    } catch (IOException e) {
        // TODO Auto-generated catch block
        // e.printStackTrace();
        System.out.println();
    } finally {
        IOUtils.closeQuietly(inStream1);
        IOUtils.closeQuietly(outStream1);
    }

}

}

五、IOUtils类,Utils意思为工具类,里面存放的全部是static静态方法
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;

public class IOUtils {

// IOUtils utils代表工具类,里面是static类
// InputStream OutputStream Reader Writer都implements Closeable
// 所以都可以调用close();方法,体现了不同对象的多态

public static void closeQuietly(InputStream inStream) {
    if (inStream != null) {
        try {
            inStream.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

public static void closeQuietly(OutputStream outStream) {
    if (outStream != null) {
        try {
            outStream.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

public static void closeQuietly(Reader reader) {
    if (reader != null) {
        try {
            reader.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

public static void closeQuietly(Writer writer) {
    if (writer != null) {
        try {
            writer.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

public static void closeQuietly(Closeable closeable) {
    if (closeable != null) {
        try {
            closeable.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

public static void copy(InputStream inStream, OutputStream outStream, int bufferSize) throws IOException {
    // 程序要严谨,要判断inStream,outStream如果==null,bufferSize如果小于等于0,都要抛出异常
    if (inStream == null) {
        throw new IllegalArgumentException("inStream不能为空");
        // IllegalArgumentException extends RuntimeException   把异常抛出去 由调用着处理
    }
    if (outStream == null) {
        throw new IllegalArgumentException("outStream不能为空");
    }
    if (bufferSize <= 0) {
        throw new IllegalArgumentException("bufferSize不能为负数");
    }
    byte[] buffer = new byte[bufferSize];
    int len;
    while ((len = inStream.read(buffer)) > 0) {// 把异常抛出去 由调用着处理
        outStream.write(buffer, 0, len);
    }
}

public static void copy(InputStream inStream, OutputStream outStream) throws IOException{
    copy(inStream, outStream, 1024*1024);//把异常抛出去,由调用着处理
} 

}

六、自己写着实验用的IOUtils
import java.io.Closeable;
import java.io.IOException;

public class IOUtils2 implements Closeable {

public IOUtils2() {
    super();
    // TODO Auto-generated constructor stub
}

@Override
public void close() throws IOException {
    // TODO Auto-generated method stub

}

}

七、自己写着实验用的IOUtils

import java.io.Closeable;
import java.io.IOException;

public interface IOUtils3 extends Closeable{

@Override
default void close() throws IOException {
    // TODO Auto-generated method stub

}

}

总结;要敢于犯错,在错误中总结经验。